notifyListeners() не возвращает данные в пользовательский интерфейс

#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:

Вам нужно обернуть виджет пользовательского интерфейса с потребителем конкретного поставщика. Таким образом, это будет состояние обновления вашего пользовательского интерфейса через поставщика.