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

Flutter:如何在FutureBuilder组件内实现页面跳转?

在Flutter FutureBuilder中实现条件页面跳转

你当前的代码存在核心问题:FutureBuilder的builder函数必须返回一个Widget,但你在widget.keyword == 'target'的分支里直接调用Navigator.push却没有返回任何Widget,这会触发Flutter框架报错。

以下是修正后的实现方案,完全满足你的需求:

body: FutureBuilder(
  future: generatedText,
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    // 数据未就绪时返回加载指示器
    if (!snapshot.hasData) {
      return const Center(child: CircularProgressIndicator());
    }

    // 满足条件时执行跳转
    if (widget.keyword == 'target') {
      // 延迟到当前帧构建完成后执行导航,避免上下文异常
      WidgetsBinding.instance.addPostFrameCallback((_) {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => NextScreen(text: snapshot.data[7]),
          ),
        );
      });
      // 返回占位Widget,保证builder始终返回有效组件
      return const SizedBox.shrink();
    }

    // 默认场景:返回列表
    return ListView.builder(
      itemCount: snapshot.data.length,
      itemBuilder: (BuildContext context, int index) {
        return InkWell(
          onTap: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => NextScreen(text: snapshot.data[index]),
              ),
            );
          },
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Text(snapshot.data[index]),
          ),
        );
      },
    );
  },
),

关键说明:

  • 强制返回Widget:无论哪个分支,builder函数都必须返回一个Widget,这里用SizedBox.shrink()作为跳转时的占位,不会影响页面视觉效果。
  • 延迟导航执行:使用WidgetsBinding.instance.addPostFrameCallback确保在当前Widget树构建完成后再触发跳转,避免因上下文未就绪引发的异常。
  • 严谨的状态判断:用snapshot.hasData替代snapshot.data == null,能更准确判断Future是否完成并返回有效数据,覆盖加载中的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:13:20