如何在flutter的主应用程序中使用本地化字符串

eqoofvh9  于 2022-12-14  发布在  Flutter
关注(0)|答案(2)|浏览(151)

我是Flutter的新手,我正在使用flutter-intl插件构建一个本地化的应用程序。我已经在.arb文件中为我的语言环境声明了一个“Title”字符串。我的程序正在尝试如下使用该字符串:

Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        S.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: S.delegate.supportedLocales,
      title: S.current.Title,

我尝试过使用S.current.TitleS.of(context).Title,在这两种情况下,当程序启动时,我都收到以下错误消息:

当我将title属性更改为title: 'my title'时,应用执行热加载,错误屏幕消失。当我将title属性更改回title: S.current.Title时,本地化标题显示,没有错误。
此行为已在Android-studio和VS-Code的Web和Android目标中得到一致确认。
我猜这与Flutter的初始化序列有关。在MaterialApp中使用本地化字符串作为属性的正确方法是什么?

cotxawn7

cotxawn71#

如文件所示:
要提供本地化标题,请使用onGenerateTitle

0ejtzxu1

0ejtzxu12#

试试这个
main.dart:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

import 'config/languages/localizations.dart';
import 'config/languages/localizations_delegate.dart';
import 'homepage.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) => MaterialApp(
        debugShowCheckedModeBanner: false,
        localizationsDelegates: const [
          MyLocalizationsDelegate(),
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
          GlobalCupertinoLocalizations.delegate,
        ],
        supportedLocales: const [
          Locale('en', ''),
          Locale('de', ''),
        ],
        onGenerateTitle: (context) => MyLocalizations.of(context)?.title ?? '',
        theme: ThemeData(primarySwatch: Colors.blue),
        home: const MyHomePage(),
      );
}

localizations.dart:

import 'package:flutter/material.dart';

class MyLocalizations {
  MyLocalizations(this.locale);

  final Locale locale;

  static MyLocalizations? of(BuildContext context) =>
      Localizations.of<MyLocalizations>(context, MyLocalizations);

  static languages() => _localizedValues.keys.toList();

  String get title => _localizedValues[locale.languageCode]!['title']!;

  static const _localizedValues = <String, Map<String, String>>{
    'en': {
      'title': 'Hello World',
    },
    'de': {
      'title': 'Hallo Welt',
    },
  };
}

本地化_委托.dart:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

import 'localizations.dart';

class MyLocalizationsDelegate extends LocalizationsDelegate<MyLocalizations> {
  const MyLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) =>
      MyLocalizations.languages().contains(locale.languageCode);

  @override
  Future<MyLocalizations> load(Locale locale) =>
      SynchronousFuture<MyLocalizations>(MyLocalizations(locale));

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

相关问题