Flutter FutureBuilder报body可能返回null的非空类型错误如何解决
问题根源
- FutureBuilder的
builder参数要求回调函数必须返回一个非空的Widget类型对象,你的代码存在两处返回缺失:- 仅在
snapshot.hasData为true的分支内创建了CustomScrollView,但没有添加return关键字将其作为返回值 - 没有处理
snapshot处于加载中、请求出错、无数据的其他分支场景,函数执行到末尾时没有任何返回值,符合报错描述的「函数体正常执行结束返回null,不符合非空返回类型要求」
- 仅在
- 额外存在空安全使用不规范的问题:已经判断
snapshot.hasData为真的前提下,snapshot.data必然非空,无需使用?.操作符;同时对article同时做了判空和!强制解包,逻辑冗余。
修复方案
补充所有分支的返回逻辑,规范空安全写法即可,替换后的build方法代码如下:
Widget build(BuildContext context) => Scaffold( body: FutureBuilder<Article>( future: _futureArticle, builder: (BuildContext context, AsyncSnapshot<Article> snapshot) { // 处理请求出错场景 if (snapshot.hasError) { return Center(child: Text('加载失败:${snapshot.error}')); } // 处理加载中场景 if (!snapshot.hasData) { return const Center(child: CircularProgressIndicator()); } // 到这一步snapshot.data必然非空,直接取值即可 final article = snapshot.data!.data; // 补充return关键字返回CustomScrollView return CustomScrollView( slivers: [ SliverAppBar( // backgroundColor: Colors.red, expandedHeight: 200, floating: true, pinned: true, flexibleSpace: FlexibleSpaceBar( background: Image.network(article == null ? 'https://www.tonymacx86.com/attachments/2019-02-05-07-50-43-jpeg.385401/' : article.imageUrl!), title: Text('${article!.title}'), centerTitle: true, ), leading: const Icon(Icons.arrow_back), actions: const [ Icon(Icons.settings), SizedBox(width: 12), ], ), buildImages(), ], ); }, ), );
内容的提问来源于stack exchange,提问作者gegentierversuche
相关产品推荐
相关产品推荐

