扑动:未处理的异常:无法加载资产:assets/languages/en

flutter: Unhandled Exception: Unable to load asset: assets/languages/en

我正在使用 flutter 本地化,我已经添加了我的语言和参数以翻译为每种语言的 json 文件。语言 json 文件位于名为 asset 的文件夹中像这样的根文件夹

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

这也是我的 en json:

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

这是我的 material 应用程序:

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

由于您的本地化文件是 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()));
  }