首页 > 解决方案 > 无法加载资产:/data/user/0/com.example.app/app_flutter/localization/en-IN.json 直到热重新加载

问题描述

我提供了ApplicationDocumentsDirectory一个名为easy_localization: ^2.3.3. 我曾经在运行时动态地将语言环境 json 文件放在应用程序目录中,这样每当用户更改语言时,我就可以调用翻译 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);

标签: flutterlocalization

解决方案


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": "സ്വാഗതം&quot;,"username":"ഉപയോക്തൃനാമം"}); //Assuming this is the translated response 

       return json.decode(translatedRes);
 
  }
}

并创建您的 AssetLoader 类,如下所示

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

推荐阅读