Flutter Bloc 状态如何初始化 shared_preferences 存储的动态语言值
问题描述
希望将应用状态的初始值,设置为通过shared_preferences持久化存储的语言设置,后续会在main.dart中通过state.language配置应用的locale。
目前写的状态类实现如下,但会触发编译错误:
import 'storageUtils.dart'; class LanguageState { //TODO: 将初始语言设置为 shared_preference 中存储的语言 LanguageState({this.language = LanguagePreference.getLanguage()}); final String language; LanguageState copyWith({ String? language, }) { return LanguageState(language: language ?? this.language); } }
配套用来读写语言设置的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"; }
触发编译错误的原因是:getLanguage()是运行时执行的动态方法,不属于编译期可确定的常量表达式,没法直接作为构造函数的默认参数值使用。需要找到可以正确读取getLanguage()返回的动态值、完成语言状态初始化的实现方式。
解决方案
调整状态类的参数定义
不要把动态读取的内容放到构造函数的默认参数位置,直接把language参数调整为实例化时显式传入的必传参数,移除原来不合法的默认值写法:
class LanguageState { // 移除不合法的默认参数,要求实例化时必须传入language值 LanguageState({required this.language}); final String language; LanguageState copyWith({ String? language, }) { return LanguageState(language: language ?? this.language); } }
在应用启动流程中提前完成数据读取
SharedPreferences本身的初始化是异步流程,同步调用拿不到存储值,因此需要在应用启动阶段把依赖准备好、把需要的初始值读取完成,再实例化状态类:
- 首先在
main函数中完成SharedPreferences的初始化(也就是调用LanguagePreference.init()) - 初始化完成后调用
getLanguage()拿到本地存储的语言值 - 用读到的真实值实例化
LanguageState,再传入应用根组件运行
参考的main.dart实现:
void main() async { // 确保Flutter平台通道初始化完成 WidgetsFlutterBinding.ensureInitialized(); // 初始化本地存储实例 await LanguagePreference.init(); // 读取本地存储的语言偏好 final storedLanguage = LanguagePreference.getLanguage(); // 用读取到的值初始化语言状态 final initialLanguageState = LanguageState(language: storedLanguage); // 运行应用,传入初始状态 runApp(MyApp(initialState: initialLanguageState)); }
适配异步加载的特殊场景
如果状态管理框架不支持在启动前同步传入初始值,可以给状态类增加加载中的中间状态,先给一个兜底的默认语言值完成首屏渲染,等异步读取到本地存储的语言值后,再调用已有的copyWith方法更新成真实值即可,不需要阻塞首屏渲染流程。
内容的提问来源于stack exchange,提问作者JonasLevin
相关产品推荐
相关产品推荐

