Flutter中Provider无法永久更新数值问题求助
问题:Provider数值无法永久更新,返回页面后自动恢复初始值
现象说明
- 初始状态:
provider.numMensajesForoEsp16Vistos = 0,provider.numMensajesForoEsp16 = 5,组件显示0/5 - 点击卡片后执行代码将
numMensajesForoEsp16Vistos设为5,打印输出确认数值为5 - 返回原页面时短暂显示
5/5,但几秒后自动恢复为0/5
相关代码
右下角显示组件代码
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ Text("${provider.numMensajesForoEsp16Vistos} / ${provider.numMensajesForoEsp16}", style: TextStyle(fontSize: 16, color: hexStringToColor( especialidad.color_especialidad))), Padding( padding: const EdgeInsets.all(8.0),child: Visibility( visible: provider.numMensajesForoEsp16 > provider.numMensajesForoEsp16Vistos, child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [Container(width: 15, height: 15, decoration: BoxDecoration( color: Colors.red, shape: BoxShape.circle), ), ], )
卡片点击事件代码
if (_esEsp) { print("nume mensajes descargados ${provider.numMensajesForoEsp16}"); provider.cambiarNumeroMensajesForo16espVistos(provider.numMensajesForoEsp16); } if (!_esEsp) { provider.cambiarNumeroMensajesForo16engVistos(provider.numMensajesForoEng16); }
ForoProvider代码
class ForoProvider extends ChangeNotifier { //VARIABLES int numMensajesForoEsp16 = 0; int numMensajesForoEng16 = 0; int numMensajesForoEsp16Vistos = 0; int numMensajesForoEng16Vistos = 0; void cambiarNumeroMensajesForo16esp (int s){ numMensajesForoEsp16 = s; notifyListeners(); } void cambiarNumeroMensajesForo16eng (int s){ numMensajesForoEng16 = s; notifyListeners(); } //vistos void cambiarNumeroMensajesForo16espVistos (int s){ numMensajesForoEsp16Vistos = s; notifyListeners(); } void cambiarNumeroMensajesForo16engVistos(int s){ numMensajesForoEng16Vistos = s; notifyListeners(); } }
顶层Consumer组件代码
Expanded( child: RefreshIndicator( onRefresh: refresh, child: Consumer<ForoProvider>( builder: (context, provider, child) { return Column(
排查方向与解决方法
检查
refresh方法逻辑:顶层组件的RefreshIndicator可能在页面返回时触发了refresh方法,重新拉取数据并重置了numMensajesForoEsp16Vistos。需确认refresh函数是否覆盖了已更新的已读状态数值。确认Provider实例唯一性:检查Provider的注册位置,若在页面内部注册,返回时可能重新创建实例导致变量回到初始值。建议在
MaterialApp顶层注册Provider,保证全局唯一。添加本地持久化:若需永久保存已读状态,可将
numMensajesForoEsp16Vistos存入SharedPreferences,初始化时读取,更新时同步写入。示例代码:
import 'package:shared_preferences/shared_preferences.dart'; class ForoProvider extends ChangeNotifier { int numMensajesForoEsp16 = 0; int numMensajesForoEsp16Vistos = 0; ForoProvider() { _loadVistos(); } Future<void> _loadVistos() async { final prefs = await SharedPreferences.getInstance(); numMensajesForoEsp16Vistos = prefs.getInt('numMensajesForoEsp16Vistos') ?? 0; notifyListeners(); } void cambiarNumeroMensajesForo16espVistos(int s) { numMensajesForoEsp16Vistos = s; _saveVistos(); notifyListeners(); } Future<void> _saveVistos() async { final prefs = await SharedPreferences.getInstance(); await prefs.setInt('numMensajesForoEsp16Vistos', numMensajesForoEsp16Vistos); } }
- 排查页面生命周期回调:返回页面时,
initState等生命周期函数可能重新调用数据加载接口,重置已读状态。需确保数据加载逻辑不会覆盖已更新的数值。
内容的提问来源于stack exchange,提问作者mvasco
相关产品推荐
相关产品推荐

