【问题标题】:How to know whether late init has been initialized in dart(flutter)?如何知道 dart(flutter) 中是否已经初始化了 late init?
【发布时间】:2021-03-24 07:38:38
【问题描述】:

我正在从 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
      )
    );
  }

【问题讨论】:

  • 有什么建议吗?

标签: flutter http dart lateinit


【解决方案1】:

您无法检查late 变量的初始化状态。如果这是您需要了解的内容,您要么需要添加并维护一个单独的标志,要么将变量设置为可为空并与 null 进行比较。

我想检测late init是否被初始化,如果没有初始化则显示spinner。

在您的情况下,您可能应该使用FutureBuilder。

【讨论】:

  • 谢谢。但是我什么时候应该使用后期初始化呢?
  • 当你可以逻辑地保证变量在初始化之前不会被使用时,你会使用late。一个示例是必须在构造函数主体中初始化的成员(并且不能从初始化列表中初始化)。
【解决方案2】:

您无法知道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 当你坚信你第一次使用后期字段时,它将被初始化。并且永远记住,使用late 会降低代码的安全性并增加运行时错误的可能性。
【解决方案3】:

我想我找到了答案,就我而言,这与 mapController 无关,而与大小有关 我添加了Flexible 作为FlutterMap 的父级,并且地图显示完美

试试下面的代码:

Flexible(
  child: FlutterMap(
    options: MapOptions(
      center: LatLng(51.5, -0.09),
      zoom: 5.0,
    ),
    layers: [
      TileLayerOptions(
        urlTemplate:
            'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
        subdomains: ['a', 'b', 'c'],
        tileProvider:
            NonCachingNetworkTileProvider(),
      ),
      MarkerLayerOptions(markers: [])
    ],
  ),
),

【讨论】:

    【解决方案4】:

    如果您使用后期初始化程序,您可以在构造函数中提供任何默认值,或者您可以将它们设为可空,但设为可空会很麻烦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多