Flutter中如何将SharedPreferences的值正确显示在Text组件中
问题根因
- 你调用的
getUserCurrencySymbol()是异步方法,then回调执行赋值操作时,UI已经完成首次渲染,所以初始加载时拿到的是未赋值的变量 then回调中修改_userCurrency后没有调用StatefulBuilder提供的setState方法,无法触发UI重绘更新- 声明的
late String _userCurrency没有做初始赋值,首次访问时会直接抛出LateInitializationError异常
修复方案
1. 调整menu.dart代码
方案A:在原有逻辑基础上修改
// 去掉late修饰,改为可空类型,或者直接给默认值避免初始化异常 String? _userCurrency; return StatefulBuilder( builder: (BuildContext context, void Function(void Function()) setState) { getUserCurrencySymbol().then((value) { // 赋值后调用setState触发UI刷新 setState(() { _userCurrency = value.toString(); }); }); return ListView( children: [ // 空值阶段显示占位文本,避免渲染异常 ListTile(title: Text(_userCurrency ?? "加载中...")), ] ); }, );
方案B:更推荐的FutureBuilder实现(无需手动管理状态更新)
return FutureBuilder<String>( future: getUserCurrencySymbol(), builder: (context, snapshot) { // 异步请求完成且有返回值时渲染业务UI if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) { return ListView( children: [ ListTile(title: Text(snapshot.data!)) ] ); } // 加载阶段可以自定义占位UI return const Center(child: CircularProgressIndicator()); } );
2. 调整controller.dart代码(可选优化,规范写法避免隐式类型问题)
Future<String> getUserCurrencySymbol() async { // 改用await写法可读性更高,和原有then实现效果一致 final value = await MySharedPreferences.instance.getUserCurrencyValue('userCurrency'); return value.toString(); } class MySharedPreferences { MySharedPreferences._privateConstructor(); static final MySharedPreferences instance = MySharedPreferences._privateConstructor(); setUserCurrencyValue(String key, String value) async { SharedPreferences instance = await SharedPreferences.getInstance(); instance.setString(key, value); } // 给方法明确返回值类型,避免隐式dynamic导致的类型异常 Future<String> getUserCurrencyValue(String key) async { SharedPreferences instance = await SharedPreferences.getInstance(); return instance.getString(key) ?? "Bitcoin"; } }
内容的提问来源于stack exchange,提问作者UTPAL GAURAV
相关产品推荐
相关产品推荐

