как использовать локализованные строки в основном приложении flutter

Я новичок во Flutter, и я создаю локализованное приложение, используя плагин flutter-intl. Я объявил строку "Заголовок" в файле.arb для своих локалей. Моя программа пытается использовать эту строку следующим образом:

  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.Title а также S.of(context).Title, и в обоих случаях при запуске программы я получаю следующее сообщение об ошибке:

Когда я меняю свойство title на title: 'my title', приложение выполняет горячую перезагрузку, и экран ошибки исчезает. Когда я изменил заголовок обратно наtitle: S.current.Title локализованный заголовок отображается без ошибок.

Такое поведение постоянно подтверждается Android-studio и VS-Code с веб-целями и Android.

Я предполагаю, что это связано с последовательностью инициализации Flutter. Как правильно использовать локализованные строки в качестве свойств в MaterialApp?

2 ответа

Согласно документации:

Чтобы вместо этого предоставить локализованный заголовок, используйте onGenerateTitle

Попробуй это.

основной.дротик:

      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(),
      );
}

локализации.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',
    },
  };
}

localizations_delegate.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;
}
Другие вопросы по тегам