问题描述
我正在 Flutter 中从 url 获取数据。我有一个称为表的后期初始化映射。我正在 initState() 函数中获取数据。当我第一次启动应用程序时,我在红色屏幕上收到 LateInizialization 错误。我想检测是否已初始化后期初始化,如果未初始化则显示微调器。这是我的代码。
class TablesTab extends StatefulWidget {
@override
_TablesTabState createState() => _TablesTabState();
}
class _TablesTabState extends State<TablesTab> {
late List<dynamic> tables;
var refreshKey = GlobalKey<RefreshindicatorState>();
GetUriData tablesInstance = new GetUriData(url: '/api/table/getAllTables');
void getTables() async {
tables = await tablesInstance.getData();
}
@override
void initState() {
super.initState();
getTables();
}
Future<void> refreshList() async {
refreshKey.currentState?.show(atTop: false);
// await Future.delayed(Duration(seconds: 2));
var updatedTables = await tablesInstance.getData();
setState(() {
tables = updatedTables;
});
//network call and setState so that view will render the new values
print(tables);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Refreshindicator(
child: GridView.count(
crossAxisCount: 4,children: List.generate(this.tables.length,(index) {
return Center(
child: GestureDetector(
onTap: () {
Navigator.pushNamed(context,'/tableReview',arguments: {'table': this.tables[index]});
},child: Container(
width: 80,height: 80,decoration: Boxdecoration(
border: Border.all(color: Theme.of(context).primaryColor,width: 2.0),borderRadius: BorderRadius.all(Radius.circular(70))
),padding: const EdgeInsets.all(14.0),child: Column(
mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [
Text(
'${this.tables[index]['tableNum']}',style: TextStyle(
color: Theme.of(context).primaryColor,fontSize: 23
),),],)
),);
}),onRefresh: refreshList
)
);
}
解决方法
您无法知道 late
字段是否已初始化。
我认为在这种情况下您不应该使用 late
。字段添加 late
表示该字段在第一次使用时会被初始化。在您的代码中,该字段不能被初始化,因此您最好使用没有 tables
的 late
,用空列表初始化它并使用布尔标志来指示加载:
var tables = [];
var loading = false;
...
Future<void> refreshList() async {
...
setState(() {
loading = true;
});
var updatedTables = await tablesInstance.getData();
setState(() {
tables = updatedTables;
loading = false;
});
...
}
,
您无法检查 late
变量的初始化状态。如果这是您需要知道的事情,您要么需要添加并维护一个单独的标志,要么将变量设为可空并与 null
进行比较。
我想检测late init是否初始化,如果没有初始化就显示spinner。
在您的情况下,您可能应该使用 FutureBuilder
。