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)。

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

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