Цель очень проста. У меня есть набор маркеров, которые показывают расположение отелей, а 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
была написана в основном классе.