我尝试在应用程序上渲染一个简单的10 x10字符网格,但网格框没有正确渲染(只显示字符,而不是框本身),并且我得到一个异常:用于空值的空检查运算符。我尝试使用late关键字,但这给了我异常“LateInitializationError:字段'grid'尚未初始化。”任何关于如何解决此问题的想法都将非常有用。谢谢!
class _MyHomePageState extends State<MyHomePage> {
Grid? grid;
List<String> selectedList = [];
var isLoaded = true;
@override
void initState() {
// TODO: implement initState
getData();
super.initState();
}
getData() async{
grid = await RemoteService().getGrid();
if(grid!=null){
print('Payload received');
setState(() {
isLoaded = true;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Wordsearch'),
),
body: Visibility(
visible: isLoaded,
replacement: const Center(child: CircularProgressIndicator()),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
for(var i=0;i<10;i++) Row(
children: [
for(var j=0;j<10;j++) GridItem(
item: grid!.grid[i][j],
isSelected: (bool value){
setState(() {
if(value){
selectedList.add(grid!.grid[i][j]);
} else{
selectedList.remove(grid!.grid[i][j]);
}
});
})
],
)
],
)
),
);
}
}
2条答案
按热度按时间pengsaosao1#
使用FutureBuilder等待异步请求
https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
你的网格需要时间来加载,所以如果你立即运行你的构建方法,它会给予你空检查错误,因为网格是空的。
7eumitmz2#
我同意targiasld的观点,如果你正在等待数据,你应该使用FutureBuilder。
或者,如果你想等待数据并在加载后显示,你的网格分配(我相信)也需要在setState调用中,既然你这样做了,不妨使用具有数据的网格来控制可见性,而不是单独的变量。
另外,对于嵌套的for循环,我假设你想要一个网格的小部件?有一个GridView widget处理网格的构建,这可能修复了空检查。
我可以提供代码样本,如果需要的话