dart 请求不包括本地化祖先的上下文的区域设置

lyr7nygr  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(91)

我正在尝试在应用程序启动时获取用户手机的Locale
我在runApp()方法中有这个Widget树:

@override
  Widget build(BuildContext context) {
    return MaterialApp(
            locale: Locale(Localizations.localeOf(context).languageCode), // This crashes
            localizationsDelegates: [
              const LocalizationDelegate(), // My custom delegate to get translations
              CountryLocalizations.delegate,
              GlobalMaterialLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate,
            ],
            supportedLocales: [
              Locale("en"),
              Locale("fr"),
            ],
            debugShowCheckedModeBanner: false,
            home: Scaffold(
              resizeToAvoidBottomInset: false,
              body: HomePage(),
            )
        );
}

字符串
locale: Locale(Localizations.localeOf(context).languageCode)导致崩溃:

Requested the Locale of a context that does not include a Localizations ancestor.


我只是想将这个locale绑定到我的Delegate,而不需要在app中进一步操作。
到目前为止,我把locale: Locale("en")从我的LocalizationDelegate读取我的en.json文件。

ruarlubt

ruarlubt1#

您必须使用MaterialApp或CupertinoApp才能使用区域设置。
对于前任

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
        GlobalMaterialLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: const <Locale>[
        Locale('de'),
        Locale('en'),
        Locale('es')
      ],
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const YourHomeWidget(), // All Localized Widgets must be placed inside home widget.
    );
  }
}

字符串
注意:Flutter Localization会自动检测系统语言并将此设置应用到您的应用程序。

zqdjd7g9

zqdjd7g92#

我也回答,因为@Jaydipsinh是对的,但我犯的错误是我认为我需要这行:

locale: Locale(Localizations.localeOf(context).languageCode)

字符串
但它毫无用处。
您只需输入supportedLocales值,如果它们与手机的区域设置匹配,flutter会自动使用给定delegates的语言,例如:

GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate


此外,还可以使用以下命令检索区域设置:String locale = Platform.localeName.split('_')[0];在应用程序启动时没有崩溃。

wgeznvg7

wgeznvg73#

这样做的技巧没有崩溃:

import 'dart:io';

String locale = Platform.localeName.split('_')[0];

字符串
谢谢

相关问题