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为例:
- 创建全局状态类:
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); } }
- 在
main.dart中注册Provider:
void main() { runApp( ChangeNotifierProvider( create: (context) => PointsProvider(), child: MyApp(), ), ); }
- PointsPage中调用状态更新:
// 按钮点击逻辑修改为 onPressed: () async { await Future.delayed(Duration(seconds: 60)); Provider.of<PointsProvider>(context, listen: false).addPoints(3); },
- CartModel中使用状态实例:
void myMethod(BuildContext context) { final pointsProvider = Provider.of<PointsProvider>(context, listen: false); int total = calculateTotal(); pointsProvider.deductPoints(total); }
这种方式能保证所有组件拿到的都是同一个points状态,更新后所有依赖的地方都会同步刷新。
内容的提问来源于stack exchange,提问作者sams
相关产品推荐
相关产品推荐

