12

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

3 回答 3

6

您无法知道late字段是否已初始化。

我认为你不应该late在这种情况下使用。添加late到字段意味着当您第一次使用它时,该字段将被初始化。在您的代码中,该字段无法初始化,因此您最好使用tableswithout late,用空列表初始化它并使用布尔标志来指示加载:

  var tables = [];
  var loading = false;

  ...

  Future<void> refreshList() async {
    ...
    setState(() {
      loading = true;
    });
    var updatedTables = await tablesInstance.getData();
    setState(() {
      tables = updatedTables;
      loading = false;
    });
    ...
  }
于 2021-03-24T08:02:42.840 回答
5

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

我想检测延迟初始化是否已初始化,如果未初始化则显示微调器。

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

于 2021-03-24T07:50:58.363 回答
0

我想我找到了答案,就我而言,这与 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: [])
    ],
  ),
),
于 2021-12-28T09:28:55.087 回答