Flutter使在使用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)。

  1. 将语言代码存储在setLocale(Locale Locale(方法的共享首选项中。

  2. 现在使用另一种方法从共享首选项中获取语言代码。将该字符串转换为Locale。并将该本地设置为提供程序,以便您的消费者在应用程序重新启动时获得更新的Locale。在主窗口小部件的initState中调用此方法。

最新更新