无法加载资产:/data/user/0/com.example.app/app_flutter/localization/en-IN.json 直到热重载

Unable to load asset: /data/user/0/com.example.app/app_flutter/localization/en-IN.json until hot reload

我将 ApplicationDocumentsDirectory 路径提供给名为 easy_localization: ^2.3.3 的本地化库。我曾经在 运行 时间动态地将语言环境 json 文件放入应用程序目录,这样每当用户更改语言时我都可以调用翻译 API 获取结果并创建 json 文件在 Application Directory 中并使用 EasyLocalization.of(context).locale = Locale(langCode, cntryCode); 更改语言。但是,当我关闭并 运行 应用程序时,它显示无法加载资产,但是当我进行热重载时,它将在应用程序下一次关闭时开始完美运行。在设备资源管理器中,我可以看到区域设置 json 文件是在初始化 EasyLocalization 和启动应用程序之前在应用程序目录中创建的。但是无法通过第一个 运行 上的简单本地化来加载这些语言环境文件。我从 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);

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_localization_loader 中任何受支持的资产加载器或编写您自己的资产加载器,如下所示。

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 class,如下所示

abstract class AssetLoader {
  const AssetLoader();
  Future<Map<String, dynamic>> load(String path, Locale locale);
}