как использовать локализованные строки в основном приложении 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;
}