Flutter bloc 状态将初始值设置为来自sharedPreferences 的动态值

Jon*_*vin 6 dart flutter flutter-bloc

我想将初始状态设置为使用shared_preferences持久保存的值。该值是我的应用程序的语言,我在 main.dart 文件中使用state.language.

import 'storageUtils.dart';

class LanguageState {
  //TODO: set initial language to language stored with shared_preference
  LanguageState({this.language = LanguagePreference.getLanguage()});
  final String language;

  LanguageState copyWith({
    String? language,
  }) {
    return LanguageState(language: language ?? this.language);
  }
}
Run Code Online (Sandbox Code Playgroud)

这些是我storageUtils.dart用来更改和获取语言的:

class LanguagePreference {
  static late SharedPreferences _preferences;

  static Future init() async =>
      _preferences = await SharedPreferences.getInstance();

  static Future changeLanguage(String language) async =>
      await _preferences.setString("language", language);

  static String getLanguage() => _preferences.getString("language") ?? "en";
}
Run Code Online (Sandbox Code Playgroud)

但由于 getLanguage 函数不是常量,我无法使用 getLanguage 函数的动态值初始化状态。是否有另一种方法可以用函数的动态值初始化语言状态getLanguage

nvo*_*igt 5

但由于 getLanguage 函数不是常量,我无法使用 getLanguage 函数的动态值初始化状态。

小修正:您不能在方法调用中使用该函数作为默认函数。

是否有另一种方法可以使用 getLanguage 函数的动态值来初始化语言状态?

当然。例如,您可以将其传递到创建状态的位置:

LanguageBloc(String language) : super(LanguageState(language));
Run Code Online (Sandbox Code Playgroud)

因此,无论您在何处创建块,都可以调用您的方法:

runApp(
    MultiBlocProvider(
      providers: [
        BlocProvider<LanguageBloc>(
           create: (context) => LanguageBloc(LanguagePreference.getLanguage())
        ),
      ]
    ...
Run Code Online (Sandbox Code Playgroud)

假设您LanguagePreference之前已经初始化过。