Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JSON文件使用i18n时应用程序启动时出现黑屏_Json_Flutter_Dart_Internationalization - Fatal编程技术网

从JSON文件使用i18n时应用程序启动时出现黑屏

从JSON文件使用i18n时应用程序启动时出现黑屏,json,flutter,dart,internationalization,Json,Flutter,Dart,Internationalization,我正在尝试构建我自己的系统实现,用于在颤振应用程序中本地化字符串以实现国际化,使用颤振的LocalizationsDelegate,并从JSON文件(每个区域设置一个JSON文件)加载本地化字符串 一切正常,但当应用程序启动时,屏幕会在几毫秒后变黑。原因是,由于我使用JSON.decode加载JSON文件,因此检索本地化字符串的方式是异步的。应用程序加载其MaterialApp小部件,然后开始解析JSON进行本地化。也就是说,在成功解析JSON之前,应用程序将变为黑色 以下是我的i18n系统的实

我正在尝试构建我自己的系统实现,用于在颤振应用程序中本地化字符串以实现国际化,使用颤振的
LocalizationsDelegate
,并从JSON文件(每个区域设置一个JSON文件)加载本地化字符串

一切正常,但当应用程序启动时,屏幕会在几毫秒后变黑。原因是,由于我使用
JSON.decode
加载JSON文件,因此检索本地化字符串的方式是异步的。应用程序加载其
MaterialApp
小部件,然后开始解析JSON进行本地化。也就是说,在成功解析JSON之前,应用程序将变为黑色

以下是我的i18n系统的实现:

类本地化使用LocalizationsProvider扩展LocaleCodeware{
本地化(this.locale):super(locale.toString());
最终地点;
静态本地化(BuildContext)=>
本地化(语境,本地化);
}
类AppLocalizationsDelegate扩展本地化sDelegate{
常量AppLocalizationsDelegate();
@凌驾
bool isSupported(Locale)=>['en','es'].contains(Locale.languageCode);
@凌驾
未来加载(区域设置)异步{
最终本地化=本地化(区域设置);
等待本地化。加载();
回归本土化;
}
@凌驾
bool应该重新加载(AppLocalizationsDelegate old)=>false;
}
导入'dart:convert';
导入“包:flifter/services.dart”;
导入“package:example/resources/asset_path.dart”作为路径;
抽象类LocaleCodeAware{
LocaleCodeAware(this.localeCode);
最终字符串localeCode;
}
本地EcoDeaware上的mixin本地化Provider{
静态映射值;
Future load()异步{
final string=await rootBundle.loadString('${path.i18n}$localeCode.json');
最终映射jsonMap=json.decode(字符串);
_values=jsonMap.map((key,value)=>MapEntry(key,value.toString());
}
字符串get-appTitle=>_值['appTitle'];
}
这是我的
main.dart
文件及其
MaterialApp
小部件

导入“包装:颤振/材料.省道”;
void main()=>runApp(ExampleApp());
类ExampleApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文)=>MaterialApp(
标题:“颤振演示”,
主题:主题数据(原始样本:颜色。蓝色),
本地化授权:[
常量AppLocalizationsDelegate(),
],
supportedLocales:const[Locale(“en”)、Locale(“es”),
主页:const AppNavigator(),
);
}
如果我没有在JSON文件中使用本地化字符串,而是将
Map
分配给
\u值
Map,然后直接从那里加载字符串,那么黑屏问题就消失了,因为这些值是硬编码的,可以同步加载


所以我的问题是,如何让我的应用程序在启动屏幕中等待,直到从JSON文件加载本地化字符串?

签出包,它比最外面的签出包更简单,它比最外面的签出包更简单

您的日志中有任何错误吗?黑屏只能由1引起。当前路由未生成可见页或2。当前路由的
build()
函数引发异常

至于在启动屏幕上加载本地化,您可以在
main()
函数中执行此操作:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  List<Locale> locales = WidgetsBinding.instance.window.locales;
  // ... logic to decide which locale to use and load localizations for

  final string = await rootBundle.loadString('${paths.i18n}$localeCode.json');
  final Map<String, dynamic> jsonMap = json.decode(string);

  runApp(ExampleApp(jsonMap));
}
void main()异步{
WidgetsFlutterBinding.ensureInitialized();
List locales=WidgetsBinding.instance.window.locales;
//…用于决定使用哪种语言环境并为其加载本地化的逻辑
final string=await rootBundle.loadString('${path.i18n}$localeCode.json');
最终映射jsonMap=json.decode(字符串);
runApp(ExampleApp(jsonMap));
}

通过这种方式,您可以在启动屏幕上读取JSON文件并将其转换为
映射
,然后将其传递给
ExampleApp
,后者又可以将其传递给
AppLocalizationsDelegate
,后者可以将其存储为局部变量并在
load()

中使用。您的日志中是否有任何错误?黑屏只能由1引起。当前路由未生成可见页或2。当前路由的
build()
函数引发异常

至于在启动屏幕上加载本地化,您可以在
main()
函数中执行此操作:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  List<Locale> locales = WidgetsBinding.instance.window.locales;
  // ... logic to decide which locale to use and load localizations for

  final string = await rootBundle.loadString('${paths.i18n}$localeCode.json');
  final Map<String, dynamic> jsonMap = json.decode(string);

  runApp(ExampleApp(jsonMap));
}
void main()异步{
WidgetsFlutterBinding.ensureInitialized();
List locales=WidgetsBinding.instance.window.locales;
//…用于决定使用哪种语言环境并为其加载本地化的逻辑
final string=await rootBundle.loadString('${path.i18n}$localeCode.json');
最终映射jsonMap=json.decode(字符串);
runApp(ExampleApp(jsonMap));
}

这样,您可以在启动屏幕上读取JSON文件并将其转换为
映射
,然后将其传递给
ExampleApp
,后者可以将其传递给
AppLocalizationsDelegate
,后者可以将其存储为局部变量并在
load()中使用

请显示
main.dart
中的所有代码,以及您对
MaterialApp
的使用情况(可能在
main.dart
中,也可能不在其中)当然,我刚刚编辑了我的问题,添加了我的
main.dart
代码。你需要使用JSON文件吗?请显示
main.dart
中的所有代码,以及你对
MaterialApp
的使用情况(可能在
main.dart
中),当然,我刚刚编辑了我的问题,添加了我的
main.dart
code。你需要使用JSON文件吗?谢谢你的回答。我知道如何在应用程序初始化之前预加载资产,这似乎是可行的,但是,如果您查看您发布的代码片段,您会很快注意到,在初始化应用程序之前,我需要访问
$localeCode
变量。我也不知道