【问题标题】:LateInitializationError: Field 'initialPosition' has not been initializedLateInitializationError:字段“initialPosition”尚未初始化
【发布时间】:2021-07-12 16:58:09
【问题描述】:

我正在尝试创建地图屏幕,但发现以下错误:

======== Exception caught by widgets library =======================================================
The following LateError was thrown building Consumer<MapViewModel>(dirty, dependencies: [_InheritedProviderScope<MapViewModel>]):
LateInitializationError: Field 'initialPosition' has not been initialized.

The relevant error-causing widget was: 
  Consumer<MapViewModel> file:///Users/mahmoudalharoon/Desktop/Air%20Forces/aireforces/lib/screens/BaseScreen.dart:44:14
When the exception was thrown, this was the stack: 
#0      MapViewModel.initialPosition (package:airforces/screens/map/viewmodel/map_viewmodel.dart)
#1      MapScreen.build.<anonymous closure> (package:airforces/screens/map/view/map_screen.dart:19:27)
#2      Consumer.buildWithChild (package:provider/src/consumer.dart:180:19)
#3      SingleChildStatelessWidget.build (package:nested/nested.dart:259:41)
#4      StatelessElement.build (package:flutter/src/widgets/framework.dart:4648:28)
...
====================================================================================================

这是下面的ViewModel 我有:

import 'package:airforces/enums/ScreenState.dart';
import 'package:airforces/screens/BaseViewModel.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class MapViewModel extends BaseViewModel {
  late LatLng? initialPosition;
  late LatLng lastMapPosition = initialPosition!;

  void getUserLocation() async {
    Position position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    List<Placemark> placemarks = await placemarkFromCoordinates(
        position.latitude, position.longitude);
    initialPosition = LatLng(position.latitude, position.longitude);
    print('${placemarks[0].name}');
    setState(ViewState.Idle);
  }
}

这是我下面的地图屏幕:

import 'package:airforces/screens/BaseScreen.dart';
import 'package:airforces/screens/map/viewmodel/map_viewmodel.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class MapScreen extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return BaseScreen<MapViewModel>(
      onFinish: (_) {
      },
      onModelReady: (mapViewModel) {
        mapViewModel.getUserLocation();
      },
      builder: (context, mapViewModel, child){
        return GoogleMap(
          initialCameraPosition: CameraPosition(
            target: mapViewModel.initialPosition!,
          ),
          myLocationEnabled: true,
        );
      },
    );
  }
}

【问题讨论】:

    标签: flutter google-maps dart


    【解决方案1】:

    出现此问题是因为 initialPosition 在发生 late 初始化之前是 null,但在此处发生后期初始化之前它正在转换为不可为空的类型:mapViewModel.initialPosition!

    您可以通过以下两种方式之一解决此问题。

    1. 访问时如果initialPositionnull,则返回默认位置。
    target: mapViewModel.initialPosition ?? [defaultPosition];
    
    1. initialPosition 初始化之前显示加载小部件,然后显示GoogleMap

    这两种解决方案都需要一个次要的状态管理解决方案,以便在最终初始化 initialPosition 时更新小部件。

    【讨论】:

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