如何知道在 dart(flutter) 中是否已初始化后期 init?

问题描述

我正在 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 表示该字段在第一次使用时会被初始化。在您的代码中,该字段不能被初始化,因此您最好使用没有 tableslate,用空列表初始化它并使用布尔标志来指示加载:

  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