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

Flutter:使用Provider时Text Widget无法随值更新

问题解决:Dialog中同步进度文本不更新的问题

核心原因

你使用Provider.of<SyncProvider>(context, listen: false)获取进度值时,listen: false会让Widget仅在初始化时获取一次值,不会监听Provider的状态变化,所以后续currentSyncProgress更新后,Text组件不会重新渲染。

解决方案

方案1:开启Provider监听

将listen参数改为true,让Widget监听Provider的状态变化,进度更新时自动重建Text:

DefaultTextStyle(
  style: TextStyle(
      fontSize: isMobile ? 9 : 15,
      color: const Color.fromARGB(221, 80, 79, 79),
      fontWeight: FontWeight.w900),
  child: Text(
      "Sync ${ Provider.of<SyncProvider>(context, listen: true).currentSyncProgress} of 10")),

方案2:使用Consumer组件(推荐)

用Consumer包裹Text组件,仅让Text部分在状态变化时重建,性能更优:

DefaultTextStyle(
  style: TextStyle(
      fontSize: isMobile ? 9 : 15,
      color: const Color.fromARGB(221, 80, 79, 79),
      fontWeight: FontWeight.w900),
  child: Consumer<SyncProvider>(
    builder: (context, syncProvider, child) {
      return Text("Sync ${syncProvider.currentSyncProgress} of 10");
    },
  ),
),

额外注意事项

确保你的SyncProvider在更新currentSyncProgress时调用了notifyListeners(),否则即使开启监听,Widget也不会收到更新通知:

class SyncProvider extends ChangeNotifier {
  int _currentSyncProgress = 0;
  int get currentSyncProgress => _currentSyncProgress;

  void updateProgress(int newProgress) {
    _currentSyncProgress = newProgress;
    notifyListeners(); // 必须调用此方法触发UI更新
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:42:09