Flutter报Body may complete normally错误 自定义Widget仅显示NewsLoading
问题原因分析
- 组件未被纳入渲染树
你代码中创建的Container和Column都只是独立的临时组件对象,既没有被嵌套到其他组件中,也没有作为函数返回值返回。Flutter仅会渲染函数返回的Widget树,这部分未被关联到返回值的代码完全不会生效,函数最终固定返回NewsLoading组件,因此页面只会显示加载进度条。 - 删除return后报错的逻辑
该函数声明的返回值类型为Widget,Dart语法要求非空返回类型的函数必须在所有执行路径下返回对应类型的有效值。你删除最后一句return语句后,函数执行完成没有返回任何值,自然会触发"Body may complete normally"的语法错误。 - 判空逻辑冗余的原因
你声明参数时使用的是Dart空安全下的非空类型List<Datum> articles和int index,这两个参数在编译层面就不允许接收null值,因此你对这两个变量判空的操作属于冗余逻辑,IDE会主动提示该问题。
修复方案
你只需要将Column作为Container的child属性值,最终返回组装完成的Container即可,示例代码如下:
Widget customListTile3(List<Datum> articles, int index, BuildContext context) { final urlImages = [ articles[0].imageUrl!, articles[1].imageUrl!, articles[2].imageUrl!, articles[3].imageUrl!, ]; String time = DateFormat( 'd MMMM yy', ).format( DateTime.parse( articles[index].date!, ), ); // 组装组件树后直接返回 return Container( margin: const EdgeInsets.all(6), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5.0), boxShadow: const [ BoxShadow(color: Colors.white, blurRadius: 1, offset: Offset(0, 0)), ]), child: Column( children: <Widget>[ Center( child: CarouselSlider.builder( options: CarouselOptions( viewportFraction: 1, ), itemCount: 4, itemBuilder: (context, idx, realIndex) { return buildImage(articles, urlImages[idx], idx, context); }, ), ), // 你可以在这里添加其他需要展示的组件,比如显示之前处理的time变量 Text(time) ], ), ); }
如果需要保留加载状态,你可以自行添加业务判断条件,满足加载场景时返回NewsLoading,其他场景返回正常的业务组件即可。
内容的提问来源于stack exchange,提问作者gegentierversuche
相关产品推荐
相关产品推荐

