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

Flutter中points变量在myMethod中取值始终为0的问题求助

问题原因与解决方案

核心问题

你在CartModel里直接实例化了一个pointsState对象:

PointsState pointsstate = pointsState();

这个全新的实例和PointsPage中Flutter框架实际管理的State完全是两个独立对象,它的points初始值就是0,所以不管页面里的points怎么更新,这里拿到的永远是0。

另外你PointsPage的按钮点击逻辑里有个笔误:punti += 3应该是points += 3,不然会触发未定义变量的报错。

解决方案1:直接通过SharedPreferences读取最新值

既然你已经用SharedPreferences持久化了points,那CartModel里直接从SP读取最新值即可,不用依赖State实例:

void myMethod() async {
  // 读取SP中存储的最新points值
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int punti = prefs.getInt('points') ?? 0;
  
  int total = calculateTotal();
  if (punti >= total) {
    punti -= total;
    // 更新后把新值存回SP
    await prefs.setInt('points', punti);
  }
}

这种方式能直接拿到页面更新后持久化的最新值,逻辑简单直接。

解决方案2:使用状态管理工具(推荐)

如果项目里需要多处共享points状态,建议用Provider、GetX这类状态管理工具,把points放到全局可访问的状态类中:
以Provider为例:

  1. 创建全局状态类:
class PointsProvider extends ChangeNotifier {
  int _points = 0;
  int get points => _points;

  PointsProvider() {
    _loadPoints();
  }

  Future<void> _loadPoints() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    _points = prefs.getInt('points') ?? 0;
    notifyListeners();
  }

  Future<void> addPoints(int value) async {
    _points += value;
    await _savePoints();
    notifyListeners();
  }

  Future<void> deductPoints(int value) async {
    if (_points >= value) {
      _points -= value;
      await _savePoints();
      notifyListeners();
    }
  }

  Future<void> _savePoints() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setInt('points', _points);
  }
}
  1. 在main.dart中注册Provider:
void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => PointsProvider(),
      child: MyApp(),
    ),
  );
}
  1. PointsPage中调用状态更新:
// 按钮点击逻辑修改为
onPressed: () async {
  await Future.delayed(Duration(seconds: 60));
  Provider.of<PointsProvider>(context, listen: false).addPoints(3);
},
  1. CartModel中使用状态实例:
void myMethod(BuildContext context) {
  final pointsProvider = Provider.of<PointsProvider>(context, listen: false);
  int total = calculateTotal();
  pointsProvider.deductPoints(total);
}

这种方式能保证所有组件拿到的都是同一个points状态,更新后所有依赖的地方都会同步刷新。

内容的提问来源于stack exchange,提问作者sams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:22:59