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

#flutter #dart #flutter-provider #riverpod

#flutter #dart #flutter-поставщик #riverpod

Вопрос:

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

 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 (_location.getLocation ())»

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

Ответ №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

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

1. Как я мог бы сделать это, не помещая службу Location() в своего собственного провайдера? Вторая часть вашего кода выглядит как то, что я хотел бы использовать

2. Проблема с объединением всего в одном поставщике заключается в том, что getLocation — это Future, а MapNotifier — StateNotifierProvider, невозможно дождаться этого будущего без использования будущего поставщика, если вы используете ..getLocation в качестве вашего примера, это будет работать, но это может сделать ваше приложение ненужным, потому что оно будет запускать код синхронно

3. Большое спасибо за объяснение! В этом есть смысл