Flutter使用Shared Preferences存储变量设上下限报错如何解决
问题原因
- 类型使用错误:你将
_progs1声明为Future<int>类型,Future代表未完成的异步任务,本身不是数值,无法直接使用<、>这类数值比较运算符,所以触发了编译报错。 - 逻辑顺序错误:你在范围判断之前就已经执行了数值减1的操作,即使判断不通过,减计算已经生效,不符合你原来的区间限制逻辑。
- 状态更新逻辑错误:你直接把
setInt返回的Future赋值给_progs1,后续UI要展示这个值时还需要额外处理异步,使用成本很高。
合理实现方案
推荐采用「内存变量供UI调用+异步同步到持久化存储」的方案,既兼顾UI使用的便捷性,又能实现数据持久化,完整实现逻辑如下:
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; class YourWidget extends StatefulWidget { const YourWidget({super.key}); @override State<YourWidget> createState() => _YourWidgetState(); } class _YourWidgetState extends State<YourWidget> { late final SharedPreferences _prefs; // 内存中直接存int值,供UI和判断逻辑直接使用 int _progs1 = 0; @override void initState() { super.initState(); _initPrefs(); } // 初始化时读取持久化存储的初始值 Future<void> _initPrefs() async { _prefs = await SharedPreferences.getInstance(); setState(() { _progs1 = _prefs.getInt('progs1') ?? 0; }); } // 递增方法 void _incrementProgS1() { if (_progs1 < 3) { setState(() { _progs1 += 1; }); // 异步更新到持久化存储,不阻塞UI _prefs.setInt('progs1', _progs1); debugPrint('$_progs1 Up'); } } // 递减方法 void _decrementProgS1() { if (_progs1 > 0) { setState(() { _progs1 -= 1; }); _prefs.setInt('progs1', _progs1); debugPrint('$_progs1 Down'); } } @override Widget build(BuildContext context) { return Row( children: [ TextButton(onPressed: _incrementProgS1, child: const Text('加1')), TextButton(onPressed: _decrementProgS1, child: const Text('减1')), Text('当前值:$_progs1'), ], ); } }
该方案所有UI渲染、逻辑判断都直接操作内存中的int值,没有异步等待的开销,也不会出现类型不匹配的问题,持久化操作异步执行不影响交互流畅度,同时满足区间限制和数据持久化的需求。
内容的提问来源于stack exchange,提问作者Carlos Costa
相关产品推荐
相关产品推荐

