Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google maps 颤振谷歌地图提供者上下文问题_Google Maps_Flutter_Android Context_Flutter Provider - Fatal编程技术网

Google maps 颤振谷歌地图提供者上下文问题

Google maps 颤振谷歌地图提供者上下文问题,google-maps,flutter,android-context,flutter-provider,Google Maps,Flutter,Android Context,Flutter Provider,我有一个基本的有状态应用程序,有一个GoogleMap底座,它可以在按下FloatingActionButton时打开一个底部表单。此选项卡用作设置选项卡,用于更改/过滤一些列表,然后地图将使用这些列表。“我的提供程序”已设置,并且可以从Google地图省道文件和底部纸张省道文件中读取/保存值 我的主要问题是如何在不在小部件树中时为Provider.of()提供上下文。例如,GoogleMap在完成加载时运行onmaCreated:\u onmaCreated,。在该函数中,我想从字符串的Pro

我有一个基本的有状态应用程序,有一个GoogleMap底座,它可以在按下FloatingActionButton时打开一个底部表单。此选项卡用作设置选项卡,用于更改/过滤一些列表,然后地图将使用这些列表。“我的提供程序”已设置,并且可以从Google地图省道文件和底部纸张省道文件中读取/保存值

我的主要问题是如何在不在小部件树中时为
Provider.of()
提供上下文。例如,GoogleMap在完成加载时运行
onmaCreated:\u onmaCreated,
。在该函数中,我想从字符串的Provider.of()中提取一个值,它告诉我要使用哪个列表(然后填充标记)

我正在尝试做的事情:

  • onMapCreated()从提供程序中提取值(稍后在DB sqflite查询中使用)
  • 底部表单需要回调并
    updateMarkers()
    以某种方式提供正确的上下文
我尝试了各种组合的传回
BuildContext
,但遗憾的是,我永远都会遇到关于小部件树的错误:


未处理的异常:错误:在此MyApp小部件上方找不到正确的提供程序

问题是在
\u onmacreated
中,您试图使用
MyApp
的上下文访问
提供程序
,该上下文在小部件的层次结构上高于
提供程序本身


将您的
主页
小部件(脚手架和它下面的所有内容)转换为一个单独的
StatefulWidget
,所有内容都应该开始工作,因为您将使用新小部件的上下文,它在小部件的层次结构中比
提供者

更低。这回答了我的问题,并且
提供者()
现在提取正确的值。然而,它提出了一个新问题——也许是一个新问题,但仍然与国家有关。当我更改一个值并调用
mainAppState.setState()
-mainAppState()时,showBottomSheet UI现在不会刷新。通过
传递一个参数,我解决了这个问题。非常感谢你的回答。问题解决
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;
}