首页 > 解决方案 > 初始化一个问题Flutter LateInitializationError 中的变量:字段“____”尚未初始化

问题描述

Flutter 的新手。我的代码运行但遇到

在构建 FutureBuilder(dirty, state: _FutureBuilderState#e1a6f) 时引发了以下 LateError:LateInitializationError:字段“initialPosition”尚未初始化。

代码是设置一个从设备获取初始位置的 GoogleMap 小部件。我收到带有该错误的红色屏幕,但几秒钟后,坐标被接收并正常进行,并正确显示地图和位置。也尝试过未来,但我得到了其他错误。它应该在 FutureBuilder 下吗?在 wrapper.dart 或我的 main.dart 中?

home.dart:

import 'package:flutter/material.dart';
import 'package:something/services/auth.dart';
import 'screens/map.dart';
import 'package:something/services/geolocator_service.dart';

class LakoApp extends StatefulWidget {
  @override


  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<LakoApp> {

  final AuthService _auth = AuthService();
  final _geolocatorService = GeolocatorService();
  late var initialPosition;

  // @override


  Future getInitialPosition <Position>() async {
    initialPosition = await _geolocatorService.getInitialLocation();
    return initialPosition;
  }

  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: FittedBox(
            child: Text('Something something'),
          ),
          actions: <Widget>[
           // irrelevant code
           // .....
           
          
        ],
        body:

        FutureBuilder(

            future: getInitialPosition(),
            builder: (context, snapshot) {
               return Map(initialPosition);
   
            }
        )
    );
  }  
  }

标签: flutterdart

解决方案


Future Builders 甚至在获取数据之前就已经构建好了。所以,你应该检查它是否有数据。

 if (snapshot.hasData) {
                return Map(initialPosition); //Or snapshot.data.
              }else{
                return CircularProgressIndicator();
              }

这里还有其他问题。我将展示一些进一步的代码来改进您自己的代码。

您的方法返回接收名为 Position 的通用参数的任何类型的 Future。我认为您想使用一种称为位置的数据类型,因为您现在需要将其移至<Position>此处,因为您现在编写它的方式对您的特定示例无用。

Future<Position> getInitialPosition () async {
    initialPosition = await _geolocatorService.getInitialLocation();
    return initialPosition;
  }

FutureBuilder 可以是这样的。

FutureBuilder<Position>(
            future: getInitialPosition(),
            builder: (context, snapshot) {
                if (snapshot.hasData) {
                return Map(snapshot.data);
              }else{
                return CircularProgressIndicator(); 
                //Display loading, you may adapt this widget to your interface or use some state management solution
              }
            }
        )

推荐阅读