У меня есть базовое 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