Показать коды ниже:
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
routes: {
"list_page": (context) => PoiList(),
"distance_page": (context) => Distance()
},
home: HomePage()
);
}
}
class HomePage extends StatelessWidget{
AMapController _aMapController;
BuildContext _buildContext;
double _clickedLat;
double _clickedLng;
void onAMapCreated(AMapController controller) {
_aMapController = controller;
}
void onPoiNaviButtonClicked(double lat, double lng) async{
print(lat);
print(lng);
_clickedLat = lat;
_clickedLng = lng;
caculate(lat, lng);
}
void caculate(double lat, double lng) async{
if (_aMapController == null){
print("_aMapController == null");
}
_aMapController.caculteDistanceBetweenTwoPois({"lat":lat, "lng":lng}); //This is the error codes.
}
void onDidCaculateDistance(int distance){
Navigator.of(_buildContext).pushNamed("distance_page", arguments: {"distance":distance, "poi":{"lat": _clickedLat,"lng":_clickedLng}});
}
List<Map<String, double>> pois = [
{'lng': 119.932382, 'lat': 31.615883},
{'lng': 119.934098, 'lat': 31.619684},
{'lng': 119.946801, 'lat': 31.608574},
{'lng': 119.957788, 'lat': 31.589859},
{'lng': 119.949548, 'lat': 31.628162}
];
@override
Widget build(BuildContext context) {
print("Widget build");
_buildContext = context;
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Stack(
fit: StackFit.expand, //未定位的widget占满stack
children: <Widget>[
AMap(onAMapCreated: onAMapCreated, onPoiNaviButtonClicked: onPoiNaviButtonClicked, onDidCaculateDistance:onDidCaculateDistance),
Positioned(
child: RaisedButton(
color: Colors.orange,
onPressed: () {
print("定位");
},
child: Text("定位"),
),
right: 20,
bottom: 60),
Positioned(
child: RaisedButton(
color: Colors.orange,
onPressed: () {
print("缩小");
_aMapController == null
? null
: _aMapController.setZoomLevel(6);
},
child: Text("缩小")),
right: 20,
bottom: 120),
Positioned(
child: RaisedButton(
color: Colors.orange,
onPressed: () {
print("放大");
_aMapController == null
? null
: _aMapController.setZoomLevel(10);
},
child: Text("放大")),
right: 20,
bottom: 180),
Positioned(
child: RaisedButton(
color: Colors.orange,
onPressed: () {
print("搜索");
//Flutter中准备poi点经纬度坐标数组,在原生地图上显示
_aMapController == null ? null : _aMapController.showNearByChargingStation(pois);
},
child: Text("搜索")),
right: 20,
bottom: 240),
Positioned(
child: RaisedButton(
color: Colors.orange,
onPressed: () {
// jump(pois, distance)
print("跳转");
// Navigator.of(context).pushNamed("list_page", arguments: {'pois': pois, 'mapController':_aMapController});
},
child: Text("跳转")),
right: 20,
bottom: 300),
],
));
}
}
В HomePage (StatelessWidget) я определяю переменную: AMapController _aMapController; В функции сборки я создал виджет AMap (это iOS native mapView). Когда AMap создан. Будет вызван обратный вызов, указанный ниже, и будет инициализирована переменная _aMapController.
void onAMapCreated(AMapController controller) {
_aMapController = controller;
}
Функция onPoiNaviButtonClicked () - это еще один обратный вызов, инициируемый собственным кодом ios. в функции onPoiNaviButtonClicked () я вызываю функцию caculate (). в функции caculate (). _AMapController иногда будет нулевым! Это очень странно. Это не происходит каждый раз! Это иногда случается? Почему!
И кажется, что вы переходите на вторую страницу (расстояние ()), а затем возвращаетесь на домашнюю страницу, иногда это случается!