【问题标题】:Trouble initializing a <Position> variable in Flutter LateInitializationError: Field '____ ' has not been initialized在 Flutter LateInitializationError 中初始化 <Position> 变量时遇到问题:字段“____”尚未初始化
【发布时间】:2021-09-02 09:05:38
【问题描述】:

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

以下 LateError 被抛出建设 FutureBuilder(脏,状态: _FutureBuilderState#e1a6f): LateInitializationError:字段'initialPosition'尚未 初始化。

代码是设置一个从设备获取初始位置的 GoogleMap 小部件。我得到带有该错误的红色屏幕,但几秒钟后,坐标被接收并正常进行并正确显示地图和位置。 future 也试过了,但我遇到了其他错误。它应该在 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);
   
            }
        )
    );
  }  
  }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

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

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

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

    您的方法返回任何类型的 Future,它接收一个名为 Position 的泛型参数。我认为您想使用一种称为位置的数据类型,您需要在此处移动&lt;Position&gt;,因为现在您编写它的方式对于您的具体示例没有用。

    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
                  }
                }
            )
    

    【讨论】:

    • 我尝试了这个,但他们创造了更多的错误。但我确定它有数据,当我打印时出现(snapshot.data)坐标。
    • 设法修复了 builder: (context, snapshot) 参数中除此之外的错误。错误:必须返回非空值,因为返回类型 'Widget' 不允许为空。
    • 它需要返回一个像 CircularPorgressIndicatorSizedBox 这样的小部件,因为它需要构建一些东西
    【解决方案2】:

    根据建议编辑代码:去掉方法和变量,因为它是多余的

    body: FutureBuilder <Position> (
            future: _geolocatorService.getInitialLocation(),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Map(snapshot.data!);
              }else {
                return Loading();
    

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 2021-12-01
      • 2022-07-12
      • 2021-10-27
      • 2021-12-29
      • 2022-01-16
      相关资源
      最近更新 更多