Невозможно открыть BottomSheet, используя всплывающее окно infoWindow маркера карт Google во флаттере - PullRequest
0 голосов
/ 17 марта 2020

Цель очень проста. У меня есть набор маркеров, которые показывают расположение отелей, а infoWindow показывает рейтинг и название отелей, а когда пользователь нажимает на информационное окно, всплывающее окно и все информация об отелях.

Я добавил оператор print внутри onTap(){} окна InfoWindow, чтобы на консоли отображалось, что он подключается, и работает правильно, я хочу сказать, что это показывает сообщение на консоли, но нижний лист не появляется.

Вот файл main.dart моего проекта:

import 'dart:async';
import 'dart:ui';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

        void main() => runApp(MyApp());

        class MyApp extends StatelessWidget {
          // This widget is the root of your application.
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              theme: ThemeData(
                  backgroundColor: Colors.white,
                  appBarTheme: AppBarTheme(elevation: 0.0, color: Colors.black12),
                  bottomSheetTheme:
                      BottomSheetThemeData(backgroundColor: Colors.transparent)),
              debugShowCheckedModeBanner: false,
              title: 'Flutter Demo',
              home: MyHomePage(),
            );
          }
        }

        class MyHomePage extends StatefulWidget {
          @override
          _MyHomePageState createState() => _MyHomePageState();
        }

        class _MyHomePageState extends State<MyHomePage> {
          final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();

          void openBottomSheet() {
            print("Opening bottom Sheet");
            var sheetController = scaffoldKey.currentState
                .showBottomSheet((context) => BottomSheetWidget());
            sheetController.closed.then((value) {
              print("Bottom Sheet Closed");
            });
          }

          @override
          Widget build(BuildContext context) {
            return Scaffold(
              key: scaffoldKey,
              backgroundColor: Colors.grey[800],
              body: Stack(children: <Widget>[
                GoogleMapsMain(
                    onInfoWindowTappedInvokeBottomSheet: () => openBottomSheet()),
                Column(
                  children: <Widget>[
                    TopMenu(),
                    ButtonClass(onPressed: () => openBottomSheet()), //This buttom is just a dummy button that shows that the bottom sheet is working.
                  ],
                ),
                BottomSearchBarOnMainPage(),
              ]),
            );
          }
        }

        class GoogleMapsMain extends StatefulWidget {
          final Function onInfoWindowTappedInvokeBottomSheet;

          GoogleMapsMain({this.onInfoWindowTappedInvokeBottomSheet});

          @override
          _GoogleMapsMainState createState() => _GoogleMapsMainState();
        }

        class _GoogleMapsMainState extends State<GoogleMapsMain> {
          ///Camera Center position
          LatLng _center = LatLng(19.120779, 72.907190);

          ///Map Controller
          GoogleMapController mapController;

          ///Markers List Initialisation
          List<Marker> allBusMarkers = [];

          ///On Map created function
          void _onMapCreated(controller) {
            setState(() {
              controller = mapController;
              ///Markers Init
              HotelLocation.forEach((element) {
                allHotelMarkers.add(Marker(
                    draggable: false,
                    markerId: MarkerId(element.id),
                    position: element.HotelCoordinates,
                    infoWindow: InfoWindow(
                        title: element.HotelName,

                        snippet: element.HotelStars,
                        onTap: (){
                          print("InfoWindow Tappeed of ${element.HotleName}");
                          GoogleMapsMain().onInfoWindowTappedInvokeBottomSheet();  //This over here is not working.
                        }
                    )));
              });
            });

          }

          @override
          Widget build(BuildContext context) {
            return Container(
              height: MediaQuery.of(context).size.height,
              width: MediaQuery.of(context).size.width,
              child: GoogleMap(
                initialCameraPosition:
                    CameraPosition(target: _center, zoom: 18, tilt: 12.0),
                rotateGesturesEnabled: false,
                markers: Set.from(allHotelMarkers),
                onMapCreated: _onMapCreated,
              ),
            );
          }
        }
         ///This is the bottom Sheet code 
        class BottomSheetWidget extends StatefulWidget {
      const BottomSheetWidget({
        Key key,
      }) : super(key: key);

      @override
      _BottomSheetWidgetState createState() => _BottomSheetWidgetState();
    }

    class _BottomSheetWidgetState extends State<BottomSheetWidget> {
      @override
      Widget build(BuildContext context) {
        return new Container(
          padding: EdgeInsets.fromLTRB(2.0, 5.0, 2.0, 2.0),
          margin: EdgeInsets.fromLTRB(10.0, 10.0, 10.0, 0.0),
          height: 275,
          width: 550,
          decoration: BoxDecoration(
            borderRadius: BorderRadius.only(
                topRight: Radius.circular(15.0), topLeft: Radius.circular(15.0)),
            color: Colors.white,
            boxShadow: <BoxShadow>[
              BoxShadow(
                  color: Colors.black26, blurRadius: 6.5, offset: Offset(0.0, 3.0))
            ],
          ),
          child: Container(
            child: Text("This is the bottom Sheet"),
          ),
        );
      }
    }

    class HotelLocationAndInformation {
      String id;
      String HotelName;
      LatLng HotelCoordinates;
      String HotelStars;

      HotelLocationAndInformation(
          {this.id, this.HotelName, this.HotelCoordinates, this.HotelStars});
    }

    final List<HotelLocationAndInformation> HotelLocation = [
      HotelLocationAndInformation(
          id: 'id_1',
          HotelName: 'Hotel Taj',
          HotelCoordinates: LatLng(19.12005, 72.90622),
          HotelStars: '3.5 Star'),
      HotelLocationAndInformation(
          id: 'id_2',
          HotelName: 'Hotel Regency',
          HotelCoordinates: LatLng(19.12075, 72.90712),
          HotelStars: '5 Star'),
    ];

        ///Remove the dummy button after used
        class ButtonClass extends StatefulWidget {
          final Function onPressed;

          ButtonClass({this.onPressed});

          _ButtonClassState createState() => _ButtonClassState();
        }

        class _ButtonClassState extends State<ButtonClass> {
          @override
          Widget build(BuildContext context) {
            return Center(
              child: Column(
                children: <Widget>[
                  //Container(color: Colors.blue, child: Text("Hello,World")),
                  Container(
                    height: 50,
                    width: 100,
                    margin: EdgeInsets.all(10.0),
                    child: FlatButton(
                      onPressed: () {
                        print("Pressed red button");
                        widget.onPressed();
                      },
                      child: Container(
                        color: Colors.red,
                      ),
                    ),
                  ),
                ],
              ),
            );
          }
        }

Я добавил кнопку, чтобы увидеть, есть ли была проблема с передачей функции в качестве параметра, так как функция openBottomSheet была написана в основном классе.

...