You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:57:00