Инициализация начальных переменных FLUTTER, как правильно?
Есть приложение, в нем несколько равнозначных экранов. Один из них карта. Для инициализации карты необходимы стартовые координаты. Для управления создал к карте контроллер. Где храню эти координаты. При инициализации контроллера записываю туда координаты 0, 0. Потом в конструкторе Контроллера считываю из SharedPreferences сохраненные значения и переписываю первоначальные. Карта же считывает данные из контролера (GET) при создании один раз. Хотелось бы - чтоб карта считывала сохраненные значения. А не те, что попали туда при инициализации класса.
лог отладки
I/flutter (27013): --> init widget and init position 0.0 0.0 3.0 (build widget)
I/flutter (27013): --> init camera setting from disk 55.698817013724856 29.248157623831418 3.0 (load)
Данные картой считываются один раз при создании widget. Поток туда не подашь. Задерживать создание карты - то же не правильно. Что то я упускаю в основах Дарта и Флаттера. Расположение Контроллера на одном уровне с картой (в том же виджете) и на один уровень выше не решает проблему. Только создание Контроллера на два уровня выше карты, как то помогло. Но думаю это случайность. Усложнив контроллер могу снова не успеть проинициализировать нужными данными.
MainApp -> Home -> Map + Controller ( не работает)
MainApp -> Home + Controller -> Map (не работает)
MainApp + Controller -> Home -> Map (вроде получилось)
инициализация карты
initialCameraPosition:
// стартовая позиция
CameraPosition(
target: LatLng(
cam.cameraSetting.latitude,
cam.cameraSetting.longitude),
zoom: cam.cameraSetting.zoom)),
создание контроллера
final CameraController cam = CameraController();
Передача контроллера вниз по дереву
Provider<CameraController>.value(value: cam),
В каком направлении думать? При Создании Виджета с картой, мне уже нужны данные из контроллера с выполненной загрузкой из хранилища. Есть способы управления порядком выполнения ASYNC процессов. Или другие правильные решения таких задач?
Ответы (2 шт):
В StatefulWidget есть метод initState который можно переопределить. В нем и следует получать контролер и его данные. initState вызывается один раз до первой прорисовки кадра.
я решил по другому. Так как использую BLOC и Stream. до получения реальных координат, я выдаю FALSE и соотвественно вместо карты, показываю индикатор загрузки.