首页 > 解决方案 > 颤振:未处理的异常:无法加载资产:资产/语言/en

问题描述

我正在使用颤振本地化,并且我添加了要翻译为每种语言的 json 文件的语言和参数。语言 json 文件位于根文件夹中名为 assets 的文件夹中,如下所示

在此处输入图像描述

我也像这样在我的 pubspec.yaml 中声明了它

在此处输入图像描述

这也是我的 en json 代码:

{
  "home_title": "Welcome To Tamata! \nThe online supermarket"
}

这是我的材料应用程序:

MaterialApp(
        locale: _locale,
        supportedLocales: [
          Locale('en', 'US'),
          Locale('ar', ''),
//          Locale('ar', 'IQ'),
        ],
        localizationsDelegates: [
          DemoLocalizations.delegate,
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
          GlobalCupertinoLocalizations.delegate,
        ],
        localeResolutionCallback: (deviceLocale, supportedLocales) {
          for (var locale in supportedLocales) {
            if (locale.languageCode == deviceLocale.languageCode &&
                locale.countryCode == deviceLocale.countryCode) {
              return deviceLocale;
            }
          }
          return supportedLocales.first;
        },
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
            primaryColor: Color(0xffba0100),
            accentColor: Color(0xff188949),
            canvasColor: Colors.grey[100],
            textTheme: TextTheme().copyWith(
              bodyText1: TextStyle(
                color: Colors.white,
                fontSize: 17.0,
                fontWeight: FontWeight.w700,
              ),
              bodyText2: TextStyle(
                color: Colors.white,
              ),
              headline6: TextStyle(
                color: Colors.black,
                fontSize: 18.0,
              ),
            )),
        title: 'Tamata Online',
        initialRoute: '/',
        routes: {
          '/': (ctx) => LoadingScreen(
              initScreen), //TODO put it back to be LoadingScreen(initScreen)
          TabsScreen.id: (ctx) => TabsScreen(
                filteredBySearch: filteredBySearch,
                filteredBySpecialSearch: filteredBySpecialSearch,
              ),
          SettingsScreen.id: (ctx) => SettingsScreen(),
          CartScreen.id: (ctx) => CartScreen(),
          IntroScreen.id: (ctx) => IntroScreen(),
          ChooseLanguageScreen.id: (ctx) => ChooseLanguageScreen(),
          SpecialOffers.id: (ctx) => SpecialOffers(),
        },
      ),

这是我的演示本地化:

import 'dart:convert';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class DemoLocalizations {
  final Locale locale;

  DemoLocalizations(this.locale);

  static DemoLocalizations of(BuildContext context) {
    return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
  }

  Map<String, String> _localizedValues;

  Future load() async {
    String jsonStringValues =
        await rootBundle.loadString('assets/languages/${locale.languageCode}'); //where it says it has a problem reading my assets/language/en

    Map<String, dynamic> mappedJson = jsonDecode(jsonStringValues);
    _localizedValues =
        mappedJson.map((key, value) => MapEntry(key, value.toString()));
  }

  String getTranslatedValue(String key) {
    return _localizedValues[key];
  }

  static const LocalizationsDelegate<DemoLocalizations> delegate =
      _DemoLocalizationDelegate();
}

class _DemoLocalizationDelegate
    extends LocalizationsDelegate<DemoLocalizations> {
  const _DemoLocalizationDelegate();

  @override
  bool isSupported(Locale locale) {
    return ['en', 'ar'].contains(locale.languageCode);
  }

  @override
  Future<DemoLocalizations> load(Locale locale) async {
    DemoLocalizations localization = DemoLocalizations(locale);
    await localization.load();
    return localization;
  }

  @override
  bool shouldReload(_DemoLocalizationDelegate old) => false;
}

我究竟做错了什么?

这是错误:

Unable to load asset: assets/languages/en
E/flutter (19559): #0      PlatformAssetBundle.load

标签: flutterdartlocalizationlocaleassets

解决方案


由于您的本地化文件采用 JSON 格式,因此您需要将 .json 添加到文件路径中。

Future load() async {
    String jsonStringValues =
        await rootBundle.loadString('assets/languages/${locale.languageCode}.json'); // add .json at the end

    Map<String, dynamic> mappedJson = jsonDecode(jsonStringValues);
    _localizedValues =
        mappedJson.map((key, value) => MapEntry(key, value.toString()));
  }

推荐阅读