Flutter试图激发showModalBottomSheet之谜

时间:2018-07-16 22:16:14

标签: dart flutter

有时我会问自己,我是不是很傻,还是Dart(扑扑)很奇怪。

这怎么不起作用?

我正在使用https://github.com/apptreesoftware/flutter_google_map_view

我显示了一张地图,并添加了标记。

由于该程序包支持侦听器,因此在点击标记时,我想显示一个模式。

监听器可以工作吗?是的,因为发生了打印语句。

模态工作吗?我不知道。没有错误显示,什么都没有!

mapView.onTouchAnnotation.listen((annotation) {
  print(annotation);
  showModalBottomSheet<void>(
    context: context,
    builder: (BuildContext context) {
      return Container(
        height: 260.0,
        child: Text('Text'),
      );
    },
  );
});

请问,什么是魔术子弹?

修改

腿部肉肉更多。这是我的脚手架小部件。

MapView mapView = new MapView();  

@override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        key: scaffoldKey,
        appBar: new AppBar(
          title: new Text('Map View Example'),
        ),
        body: new Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            showMap(context),
          ],
        ),
      ),
    );

showMap(...)看起来像这样:

 showMap(context) {
    mapView.show(
      new MapOptions(
          mapViewType: MapViewType.normal,
          showUserLocation: true,
          showMyLocationButton: true,
          showCompassButton: true,
          initialCameraPosition:
              new CameraPosition(new Location(5.6404963, -0.2285315), 15.0),
          hideToolbar: false,
          title: "Dashboard"),
      // toolbarActions: [new ToolbarAction("Close", 1)],
    );
    mapView.onMapReady.listen((_) {
      mapView.setMarkers(_markers);
    });
    mapView.onTouchAnnotation.listen((annotation) {
      print(annotation);
      showModalBottomSheet<void>(
        context: context,
        builder: (BuildContext context) {
          return Container(
            height: 260.0,
            child: Text('Text'),
          );
        },
      );
    });
  }

1 个答案:

答案 0 :(得分:1)

您遇到问题的原因是您的context不包含脚手架。如果您在代码中查看正在执行的操作,则上下文实际上来自封装支架的小部件。

YourWidget <------------ context
  MaterialApp
    Scaffold
      AppBar
      Column
        showMap....

有两种方法可以解决此问题。您可以使用类似这样的Builder小部件:

    body: new WidgetBuilder(
      builder: (context) => new Column(
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          showMap(context),
        ],
      )
    ),

在这种情况下,上下文实际上植根于支架下方。

YourWidget 
  MaterialApp
    Scaffold
      AppBar
      Builder <------------ context
        Column
          showMap....

但是,我真正推荐的是将您的课程分为多个课程。如果您的构建函数足够大,则必须将其分离为另一个函数(该函数仅使用一次),很有可能需要一个新的小部件!

您既可以制作主体小部件(可能是无状态的),也可以制作仅用于显示地图的小部件(根据您的需要是无状态的或有状态的)……或更可能是两者!

现在为什么看不到任何错误...您是在调试还是发布模式下运行(如果处于调试模式,则屏幕右上方应该有一个小横幅)?如果您处于发布模式,则它可能会忽略上下文中没有脚手架并以静默方式失败的事实,而在调试模式下,它应该引发断言错误。从IDE运行或与flutter run一起运行通常在调试模式下运行,但是您可能已对其进行了更改。