Flutter 在热重新加载之前,无法加载资产:/data/user/0/com.example.app/app\u flatter/localization/en-IN.json

Flutter 在热重新加载之前,无法加载资产:/data/user/0/com.example.app/app\u flatter/localization/en-IN.json,flutter,localization,Flutter,Localization,我正在为名为easy\u本地化:^2.3.3的本地化库提供ApplicationDocumentsDirectory路径。我曾经在运行时将locale json文件动态地放在应用程序目录中,这样每当用户更改语言时,我都可以调用translation API获取结果并在应用程序目录中创建json文件,并使用EasyLocalization.of(context.locale=locale(langCode,cntryCode)更改语言。但当我关闭并运行应用程序时,它显示无法加载资源,但当我进行热加

我正在为名为
easy\u本地化:^2.3.3
的本地化库提供
ApplicationDocumentsDirectory
路径。我曾经在运行时将locale json文件动态地放在应用程序目录中,这样每当用户更改语言时,我都可以调用translation API获取结果并在应用程序目录中创建json文件,并使用
EasyLocalization.of(context.locale=locale(langCode,cntryCode)更改语言。但当我关闭并运行应用程序时,它显示无法加载资源,但当我进行热加载时,它将在下一次关闭应用程序时开始正常工作。在设备浏览器中,我可以看到在初始化
EasyLocalization
和启动应用程序之前,在应用程序目录中创建了区域设置json文件。但无法在第一次运行时通过轻松本地化加载这些区域设置文件。我正在从
main()
启动我的应用程序,如下所示

  EasyLocalization localization = EasyLocalization(
  path: '$applicationDirPath/localization',
  supportedLocales:  [Locale('en', 'US'), Locale('de', 'DE'), Locale('hi', 'IN')],
  fallbackLocale: Locale('en', 'IN'),
  child: AppRootWidget());
  runApp(localization);
class MyAssetLoader extends AssetLoader {
 
  @override
  Future<Map<String, dynamic>> load(String path, Locale locale) async {
            
    //Assuming the source is in english and json
  
      String sourceString = jsonEncode({"welcome": "Welcome","username":"User Name"}); // you can read the base source language from file and assign to sourceString here
      
        if(locale.languageCode == 'ml') // Translation API can be implemented here by passing sourceString                                      
          String translatedRes = jsonEncode({"welcome": "സ്വാഗതം","username":"ഉപയോക്തൃനാമം"}); //Assuming this is the translated response 

       return json.decode(translatedRes);
 
  }
}

assetLoader
可用于解决此情况。将属性assetLoader添加到EasyLocalization,如下所示

EasyLocalization localization = EasyLocalization(
  path: 'assets/localization',
  supportedLocales:  [Locale('en', 'US'), Locale('de', 'DE'), Locale('hi', 'IN')],
  assetLoader: MyAssetLoader(),
  fallbackLocale: Locale('en', 'IN'),
  child: AppRootWidget());
您可以使用软件包
easy\u localization\u loader
中任何受支持的资产加载器,或者编写自己的资产加载器,如下所示

  EasyLocalization localization = EasyLocalization(
  path: '$applicationDirPath/localization',
  supportedLocales:  [Locale('en', 'US'), Locale('de', 'DE'), Locale('hi', 'IN')],
  fallbackLocale: Locale('en', 'IN'),
  child: AppRootWidget());
  runApp(localization);
class MyAssetLoader extends AssetLoader {
 
  @override
  Future<Map<String, dynamic>> load(String path, Locale locale) async {
            
    //Assuming the source is in english and json
  
      String sourceString = jsonEncode({"welcome": "Welcome","username":"User Name"}); // you can read the base source language from file and assign to sourceString here
      
        if(locale.languageCode == 'ml') // Translation API can be implemented here by passing sourceString                                      
          String translatedRes = jsonEncode({"welcome": "സ്വാഗതം","username":"ഉപയോക്തൃനാമം"}); //Assuming this is the translated response 

       return json.decode(translatedRes);
 
  }
}
类MyAssetLoader扩展AssetLoader{
@凌驾
未来加载(字符串路径、区域设置)异步{
//假设源代码是英语和json
String sourceString=jsonEncode({“欢迎”:“欢迎”,“用户名”:“用户名”});//您可以从文件中读取基本源语言,并在此处分配给sourceString
if(locale.languageCode=='ml')//这里可以通过传递sourceString来实现翻译API
字符串translatedRes=jsonEncode({“欢迎”:”സ്വാഗതം","用户名“:”ഉപയോക്തൃനാമം"}); //假设这是已翻译的响应
返回json.decode(translatedRes);
}
}
并创建AssetLoader类,如下所示

abstract class AssetLoader {
  const AssetLoader();
  Future<Map<String, dynamic>> load(String path, Locale locale);
}
抽象类AssetLoader{
const AssetLoader();
未来加载(字符串路径、区域设置);
}