运行Widget时触发body_might_complete_normally错误,如何修复?
修正"body_might_complete_normally"错误的方案
错误原因
ListView.builder的itemBuilder是必须返回Widget的回调函数,你的代码仅在index < _todoItems.length时返回了_buildTodoItem,当索引超出待办事项数量时无任何返回内容,Dart会判定该函数可能正常结束(无返回值),从而触发此错误。
修正方法
有两种可行的解决方式,其中指定itemCount的方法更简洁高效:
方法1:添加默认返回值
在if分支外补充一个默认返回的Widget,比如空容器:
// Build the whole list of todo items Widget _buildTodoList() { return ListView.builder( itemBuilder: (context, index) { if (index < _todoItems.length) { return _buildTodoItem(_todoItems[index], index); } // 补充默认返回值,避免函数无返回结束 return Container(); }, ); }
方法2:指定itemCount属性(推荐)
直接告诉ListView待办事项的总数,这样itemBuilder只会被调用_todoItems.length次,从根源上避免索引超出的情况:
// Build the whole list of todo items Widget _buildTodoList() { return ListView.builder( // 指定列表项总数 itemCount: _todoItems.length, itemBuilder: (context, index) { return _buildTodoItem(_todoItems[index], index); }, ); }
说明
方法2是更优解,它明确限制了列表的长度,避免不必要的回调调用,同时彻底消除了无返回值的风险,代码逻辑也更清晰。
内容的提问来源于stack exchange,提问作者Lexy Morse
相关产品推荐
相关产品推荐

