#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. Большое спасибо за объяснение! В этом есть смысл