Проблема с провайдером GoogleMap - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть базовое c приложение с состоянием, с базой GoogleMap, которое открывает BottomSheet при нажатии FloatingActionButton. Это используется как вкладка настроек для изменения / фильтрации некоторых списков, которые затем используются картой. Мой поставщик настроен, и значения могут быть считаны / сохранены как из файла дротика GoogleMap, так и из файла дротика BottomSheet.

Моя главная проблема заключается в том, как предоставить контекст для Provider.of(), когда его нет в дереве виджетов. Например, GoogleMap запускает onMapCreated: _onMapCreated, после завершения загрузки. Из этой функции я хочу извлечь значение из Provider.of () a String, которая сообщает мне, какой список использовать (который затем заполняет маркеры).

То, что я пытаюсь сделать:

  • onMapCreated () извлекает значение из провайдера (которое позже используется в запросе sqlflite к БД)
  • В нижней части необходимо как-то вызвать обратный вызов и updateMarkers(), чтобы обеспечить правильный контекст
void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  GoogleMapController mapController;

  void _onMapCreated(GoogleMapController controller) {
    mapController = controller;

    print(Provider.of<MyAppStateContainer>(context, listen:false).getSomeValue);  <---- Doesn't work
  ...
}


@override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<MyAppStateContainer>(
      create: (contextooo) => MyAppStateContainer(),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text('My Map'),
            backgroundColor: Colors.green[700],
          ),

          //Put in a stack widget so can layer other widgets on top of map widget
          body: Stack(
            children: <Widget>[
              //Builder so we can get a CTX made, and then Provider.of() finds the Provider
              Builder(
                builder: (context) => GoogleMap(
                  mapType: Provider.of<MyAppStateContainer>(context).getMapType, <--- Works fine
                  markers: _markers,
                  onMapCreated: _onMapCreated,

             ...
}

Поставщик:

class MyAppStateContainer extends ChangeNotifier {
  MyAppStateContainer();

  MapType _mapType = MapType.terrain;
  String _someValue;

  MapType get getMapType => _mapType;
  String get getSomeValue => _someValue;
}

Я перепробовал все виды комбинаций передачи назад BuildContext context, но, к сожалению, я навсегда получаю эту ошибку о дереве виджетов :

Unhandled Exception: Error: Could not find the correct Provider<MyAppStateContainer> above this MyApp Widget

1 Ответ

1 голос
/ 29 февраля 2020

Проблема в том, что в _onMapCreated вы пытаетесь получить доступ к Provider, используя контекст MyApp, который выше иерархии виджетов, чем сам Provider.

Преобразуйте ваш home виджет (Scaffold и все, что под ним) в отдельный StatefulWidget, и все должно начать работать, так как вы будете использовать контекст нового виджета, который ниже иерархии виджетов, чем Provider.

...