#flutter #flutter-provider #flutter-change-notifier
Вопрос:
Я новичок в flutter и нуждаюсь в некоторой помощи, пожалуйста, у меня есть этот экран с картами Google (упрощенный для здесь):
class OrderDetailsScreen1 extends StatefulWidget {
const OrderDetailsScreen1({
Key? key,
}) : super(key: key);
@override
_OrderDetailsScreen1State createState() => _OrderDetailsScreen1State();
}
class _OrderDetailsScreen1State extends State<OrderDetailsScreen1> {
@override
Widget build(BuildContext context) {
final googleMapsNotifier =
Provider.of<GoogleMapsNotifier>(context, listen: true);
double latitude = -33.75;
double longitude = -70.67;
if (googleMapsNotifier.currentLocation != null) {
latitude = googleMapsNotifier.currentLocation!.latitude;
longitude = googleMapsNotifier.currentLocation!.longitude;
}
return Scaffold(
body: SafeArea(
child: SizedBox(
height: 300,
child: GoogleMap(
myLocationEnabled: true,
initialCameraPosition: CameraPosition(
target: LatLng(latitude, longitude),
zoom: 14,
),
),
),
),
);
}
}
Я отодвигаю этот экран от предыдущего вот так
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => Provider<GoogleMapsNotifier>(
create: (_) => GoogleMapsNotifier(),
child: OrderDetailsScreen1(
),
)));
},
И у меня есть такой класс GoogleMapsNotifier with ChangeNotifier
, как этот
class GoogleMapsNotifier with ChangeNotifier {
final geolocatorService = GeolocatorService();
Position? currentLocation;
GoogleMapsNotifier() {
setCurrentLocation();
}
setCurrentLocation() async {
currentLocation = await geolocatorService.determinePosition();
print(currentLocation!.latitude);
notifyListeners();
}
}
Внутри setCurrentLocation()
GoogleMapsNotifier
все currentLocation
в порядке, и он отлично печатает. Но notifyListeners()
не передает данные обратно в пользовательский интерфейс (OrderDetailsScreen1). Он не реагирует, и у меня нет ошибок в консоли. В чем же ошибка?
UPD: Я попытался изменить маршрут отправки материалов на приведенный ниже, но это не помогло
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => Provider.value(
value: Provider.of<GoogleMapsNotifier>(context),
child: OrderDetailsScreen1(),
)));
},
Ответ №1:
Вы должны передать существующему поставщику
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => Provider.value(
value: googleMapsNotifier,
child: OrderDetailsScreen1(
),
)));
},
Комментарии:
1. Я пытался, и это ничего не изменило. Пожалуйста, посмотрите upd главного поста, как я его установил.
2. @MarchukAnton, проверьте Devtools, находится ли ваш поставщик googleMapsNotifierProvider в дереве OrderDetailScreen1. И помните, что поставщик создает, создайте новый экземпляр этого поставщика. он не будет использовать существующего поставщика, у которого есть изменения.
Ответ №2:
Вам нужно обернуть виджет пользовательского интерфейса с потребителем конкретного поставщика. Таким образом, это будет состояние обновления вашего пользовательского интерфейса через поставщика.