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

Flutter中如何更新Scaffold的Body内容?我的实现为何无效?

问题原因

你定义的readPage是build方法内部的局部变量,每次调用build(包括setState触发的重绘)都会重新执行Widget readPage = BeforeRead(theme: theme);,将变量重置为初始状态。你在FAB点击事件中修改的只是当前build周期内的局部变量,下一次重绘时会被覆盖,导致页面无法更新。

解决方案

有两种常见的修复方式:

方式一:将readPage改为State类的成员变量

把readPage从build方法内移到State类的成员位置,确保状态在多次build之间保持:

class _MainPageState extends State<MainPage> {
  late Widget _readPage;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    // 在didChangeDependencies中初始化,因为这里可以安全获取Theme
    final theme = Theme.of(context);
    _readPage = BeforeRead(theme: theme);
  }

  @override
  Widget build(BuildContext context) {
    final ThemeData theme = Theme.of(context);

    return Scaffold(
      // ... 其他代码保持不变
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _readPage = AfterRead(theme: theme);
          });
        },
        child: const Icon(Icons.nfc),
      ),
      body: PageView(
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: _readPage,
          ),
          // ... 其他页面
        ],
      ),
    );
  }
}

方式二:用状态变量控制页面切换(推荐)

不直接存储Widget实例,而是用一个布尔值标记状态,在build方法中根据状态动态生成对应的页面,更符合Flutter状态驱动UI的设计思路:

class _MainPageState extends State<MainPage> {
  bool _isNfcRead = false;

  @override
  Widget build(BuildContext context) {
    final ThemeData theme = Theme.of(context);
    Widget readPage = _isNfcRead ? AfterRead(theme: theme) : BeforeRead(theme: theme);

    return Scaffold(
      // ... 其他代码保持不变
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _isNfcRead = true;
          });
        },
        child: const Icon(Icons.nfc),
      ),
      body: PageView(
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: readPage,
          ),
          // ... 其他页面
        ],
      ),
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:58:15