Flutter Riverpod / Provider: установка начального состояния для stateNotifier

Итак, я хочу иметь провайдера, начальное состояние которого будет местоположением пользователя, это то, что у меня есть сейчас, правильно?

import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/all.dart';
import 'package:location/location.dart';

class MapApiState {
  final LocationData userLocation;
  MapApiState({@required this.userLocation});
}

class MapNotifier extends StateNotifier<MapApiState> {
  static Location _location = Location();

  MapNotifier() : super(null) {
    _location.getLocation().then((initialState) =>
        super.state = MapApiState(userLocation: initialState));
  }
}

Это правильный подход? Как мне теперь объявить для этого глобальную переменную поставщика? Меня беспокоит super (null). Но я не могу просто поставить super (_location.getLocation ())

Кроме того, как мне затем создать экземпляр моей глобальной переменной поставщика?


person Shazamo Morebucks    schedule 06.12.2020    source источник


Ответы (1)


Ну, это почти зависит от того, как вы хотите применить его в жизненном цикле своего приложения, вы можете использовать StreamProvider или FutureProvider, чтобы получить местоположение, а затем передать его своему StateNotifier

final locationProvider = FutureProvider<LocationData>((ref) {
  final Location _location = Location();

  return _location.getLocation();
});

final singleDetailDealProvider = StateNotifierProvider<MapNotifier>((ref) {
  final location = ref.watch(locationProvider);
  return MapNotifier(location.data?.value);
});

class MapNotifier extends StateNotifier<MapApiState> {
  MapNotifier(LocationData location) : super(location);
}

Таким образом, если вы хотите использовать местоположение в другом месте, вы можете вызвать locationProvider вне зависимости от состояния MapNotifier.

person EdwynZN    schedule 06.12.2020
comment
Как я мог сделать это, не помещая службу Location () внутри ее собственного провайдера? Вторая часть вашего кода выглядит так, как будто я хотел бы использовать - person Shazamo Morebucks; 07.12.2020
comment
Проблема с объединением всего в одном провайдере заключается в том, что getLocation - это Future, а MapNotifier - StateNotifierProvider, нет возможности ждать этого будущего без использования Future провайдера, если вы используете ..getLocation в качестве вашего примера, он будет работать, но может сделайте свое приложение ненужным, потому что он будет запускать код синхронно - person EdwynZN; 07.12.2020
comment
Большое спасибо за объяснение! Это имеет смысл - person Shazamo Morebucks; 08.12.2020