Flutter 在使用 Provider 时使更改的应用程序语言持久化
Flutter make changing app language persistent while using Provider
我有一个用户可以使用提供程序更改语言的工作示例,并且工作正常,但是当我关闭应用程序并返回时,它会恢复为默认设置 'en',我只想让用户选择最新的一个,如果用户没有选择其他任何一个,则将其保留为默认值。
// main.dart
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => LocaleProvider()),
],
child: Consumer<LocaleProvider>(
builder: (context, provider, snapshot) {
return MaterialApp(
debugShowCheckedModeBanner: false,
locale: provider.locale,
home: screenToShow,
supportedLocales: L10n.all,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
);
},
),
);
}
class LocaleProvider with ChangeNotifier {
Locale? _locale;
Locale? get locale => _locale;
void setLocale(Locale locale) {
if (!L10n.all.contains(locale)) return;
_locale = locale;
notifyListeners();
}
}
// dropdown to change language
Consumer<LocaleProvider>(
builder: (context, provider, snapshot) {
var lang =
provider.locale ?? Localizations.localeOf(context);
return DropdownButton(
value: lang,
onChanged: (Locale? val) {
provider.setLocale(val!);
},
items: L10n.all
.map(
(e) => DropdownMenuItem(
value: e,
child: _title(e.languageCode),
),
)
.toList(),
);
},
)
使用共享首选项(https://pub.dev/packages/shared_preferences)。
在 setLocale(Locale locale) 方法的共享首选项中存储语言代码。
现在创建另一种方法从共享首选项中获取语言代码。将该字符串转换为语言环境。并将该本地设置为提供者,以便您的消费者在应用程序重新启动时获得更新的区域设置。在您的主要小部件的 initState 中调用此方法。
我有一个用户可以使用提供程序更改语言的工作示例,并且工作正常,但是当我关闭应用程序并返回时,它会恢复为默认设置 'en',我只想让用户选择最新的一个,如果用户没有选择其他任何一个,则将其保留为默认值。
// main.dart
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => LocaleProvider()),
],
child: Consumer<LocaleProvider>(
builder: (context, provider, snapshot) {
return MaterialApp(
debugShowCheckedModeBanner: false,
locale: provider.locale,
home: screenToShow,
supportedLocales: L10n.all,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
);
},
),
);
}
class LocaleProvider with ChangeNotifier {
Locale? _locale;
Locale? get locale => _locale;
void setLocale(Locale locale) {
if (!L10n.all.contains(locale)) return;
_locale = locale;
notifyListeners();
}
}
// dropdown to change language
Consumer<LocaleProvider>(
builder: (context, provider, snapshot) {
var lang =
provider.locale ?? Localizations.localeOf(context);
return DropdownButton(
value: lang,
onChanged: (Locale? val) {
provider.setLocale(val!);
},
items: L10n.all
.map(
(e) => DropdownMenuItem(
value: e,
child: _title(e.languageCode),
),
)
.toList(),
);
},
)
使用共享首选项(https://pub.dev/packages/shared_preferences)。
在 setLocale(Locale locale) 方法的共享首选项中存储语言代码。
现在创建另一种方法从共享首选项中获取语言代码。将该字符串转换为语言环境。并将该本地设置为提供者,以便您的消费者在应用程序重新启动时获得更新的区域设置。在您的主要小部件的 initState 中调用此方法。