Flutter: поле экземпляра, не подлежащее аннулированию, «Текущее местоположение» должно быть инициализировано

#flutter

Вопрос:

Я получаю ошибку с новыми изменениями флаттера на нулевой безопасности. Не уверен, должен ли я добавить окончательный/поздний/! в этом кодексе.

У меня есть код для подключения к картам Google, и теперь я хочу иметь возможность хранить собранные данные.

Прямо сейчас я столкнулся с ошибкой в блоке приложений: Non-nullable field 'currentLocation' must be initialized.

 import 'package:flutter/material.dart';
import 'package:hawkepedia/services/geolocator_Services.dart';

import 'package:geolocator/geolocator.dart';

class ApplicationBloc with ChangeNotifier {
  final geoLocatorService = GeolocatorService();

  //Variables
 Position currentLocation;

  //fire function when the app starts
  ApplicationBloc(){
    setCurrentLocation();
  }

  //gets current location
  setCurrentLocation() async {
    currentLocation = await geoLocatorService.getCurrentLocation();
    notifyListeners();
  }
}
 

Ответ №1:

Как указано в сообщении об ошибке, полем, вызывающим проблему, является currentLocation.

Ты можешь:

  • установите его как late значение, означающее, что вы инициализируете его, например, во время initState.
  • установите для него значение null, не уверен, что это возможно в данном случае Position? currentLocation . (Но это для основных типов)
  • Инициализируйте его нейтральным значением, которое, как вы знаете, еще не инициализировано

Редактировать:

 import 'package:flutter/material.dart';
import 'package:hawkepedia/services/geolocator_Services.dart';

import 'package:geolocator/geolocator.dart';

class ApplicationBloc with ChangeNotifier {
  final geoLocatorService = GeolocatorService();

  //Variables
 late Position currentLocation;

  //fire function when the app starts
  ApplicationBloc(){
    setCurrentLocation();
  }

  //gets current location
  setCurrentLocation() async {
    currentLocation = await geoLocatorService.getCurrentLocation();
    notifyListeners();
  }
}

 

Комментарии:

1. Привет @Wapazz, я попытался изменить свой код на приведенный ниже, но он все равно выдает ошибку. Как мне инициализировать его в initState? setCurrentLocation() асинхронно { позднее текущее местоположение = ожидание геоЛокаторСервиса.getCurrentLocation(); Уведомители(); } }

2. это был общий ответ, у вас нет состояния инициализации за пределами виджета

3. вы должны указать ключевое слово late в объявлении переменной, в верхней части вашего класса, а не внутри вашей функции

4. Так что это работает, если у вас больше нет ошибки, не так ли ? 🙂 Это просто еще одна проблема в вашем коде. Может быть, создать еще один с подробностями кода, в котором он загружает данные и т. Д.

5. Привет @Wapazz, я пробовал ваш метод, но он все равно не работает. Я также попытался изменить свой код на «Позиция? Текущее местоположение». Однако, поскольку у меня есть команда Futures на другой странице dart под названием «Будущая асинхронная<Позиция> getCurrentLocation ()», мой код просто продолжает загружаться, а консоль отладки указывает «<Позиция><асинхронная приостановка>»