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
相关产品推荐
相关产品推荐

