У меня проблема с плагином mapview.Все в порядке, когда я нажимаю кнопку, чтобы отправить смс, и прочитать полученные смс, чтобы запустить карту и отобразить положение.но у меня визуальная проблема, когда я меняю страницу с navigator.push и возвращаюсь на главную страницу, чтобы перезапустить карту.В этот момент, когда я перезапускаю карту, у меня есть стек из двух карт.Если я повторяю манипуляции, у меня есть три стека карт ... и т. Д.
У меня возникает другая проблема, когда я использую кнопку «Назад» на устройстве, когда карта открыта, карта закрывается, но когда я перезапускаю картутег локализации удаляется.Мне нужно нажать «Фермер», чтобы сделать mapView.dismiss ();и после этого все в порядке.но кнопка «Назад» на устройстве этого не делает.
вот мой код:
import 'package:flutter/material.dart';
import 'package:map_view/map_view.dart';
import 'dart:async';
import 'package:sms/sms.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter map Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'page1'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
MapView mapView = new MapView();
CameraPosition cameraPosition;
String nirbinumber;
String groupnirbinum;
String groupsmsmap;
String grouplat;
String grouplong;
double lat;
double long;
var compositeSubscription = new CompositeSubscription();
var API_KEY = "< >"; // my google api key
SmsMessage _lastMessage = new SmsMessage('', '');
StreamSubscription<SmsMessage> _smsSubscription;
@override
void initState() {
super.initState();
nirbinumber =" XXXXXXXXXX "; //my phone number to received test sms
new SmsReceiver().onSmsReceived.listen((SmsMessage msg) {
RegExp regExp = new RegExp(
r"^0([0-9]{9})", //Here is the regex function to match phone number
);
var match = regExp.firstMatch(nirbinumber);
groupnirbinum = match.group(1);
if (msg.address == "+33$groupnirbinum") { // wait to received my sms to action
setState(() {
_lastMessage = msg;
});
RegExp regExp = new RegExp( //Here is the regex function to match first word of sms (here maps)
r"^([\w\-]+)",
);
var match = regExp.firstMatch(_lastMessage.body);
groupsmsmap = match.group(1);
if (groupsmsmap =="maps" ) {
MapView.setApiKey(" my google map api key ");
showMap();
}
}
}
);
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
floatingActionButton: new FloatingActionButton(
onPressed: () {
new SmsSender().sendSms(new SmsMessage(nirbinumber,"maps" )); //function to send sms after onPressed
},
child: new Icon(Icons.location_on),
), //
body : new Center(
child : new RaisedButton(
child: const Text('Next page'),
onPressed: () {
Navigator.push(
context,
new MaterialPageRoute(builder: (context) => new MyHomePage2()),
);
}
)
)
);
}
showMap() { // code from the exemple of the mapview plugin
mapView.show(
new MapOptions(
mapViewType: MapViewType.hybrid,
showUserLocation: true,
initialCameraPosition: new CameraPosition(
new Location(5.0,0.0),18.0),
title: "Position de Nirbi"),
toolbarActions: [new ToolbarAction("Fermer", 1)]);
StreamSubscription sub = mapView.onMapReady.listen((_) {
mapView.addMarker(new Marker("3", "test",6.0,0.0,
color:Colors.lightBlue));
mapView.addMarker(
new Marker("4", "test2", 5.0,0.0,
color:Colors.orangeAccent, markerIcon: new MarkerIcon(
"assets/home_tag_orange.png", //Asset to be used as icon
width: 130.0, //New width for the asset
height: 130.0, // New height for the asset
),));
mapView.zoomToFit(padding: 500);
});
sub = mapView.onTouchAnnotation
.listen((annotation) => print("annotation ${annotation.id} tapped"));
compositeSubscription.add(sub);
sub = mapView.onMapTapped
.listen((location) => print("Touched location $location"));
compositeSubscription.add(sub);
sub = mapView.onCameraChanged.listen((cameraPosition) =>
this.setState(() => this.cameraPosition = cameraPosition));
compositeSubscription.add(sub);
sub = mapView.onToolbarAction.listen((id) {
print("Toolbar button id = $id");
if (id == 1) {
mapView.dismiss();
}
});
compositeSubscription.add(sub);
sub = mapView.onInfoWindowTapped.listen((marker) {
print("Info Window Tapped for ${marker.title}");
});
compositeSubscription.add(sub);
}
}
class CompositeSubscription {
Set<StreamSubscription> _subscriptions = new Set();
void cancel() {
for (var n in this._subscriptions) {
n.cancel();
}
this._subscriptions = new Set();
}
void add(StreamSubscription subscription) {
this._subscriptions.add(subscription);
}
void addAll(Iterable<StreamSubscription> subs) {
_subscriptions.addAll(subs);
}
bool remove(StreamSubscription subscription) {
return this._subscriptions.remove(subscription);
}
bool contains(StreamSubscription subscription) {
return this._subscriptions.contains(subscription);
}
List<StreamSubscription> toList() {
return this._subscriptions.toList();
}
}
class MyHomePage2 extends StatefulWidget { // page 2, to show simulate the issue of duplication of map
MyHomePage2({Key key, this.title2}) : super(key: key);
final String title2;
@override
_MyHomePage2State createState() => new _MyHomePage2State();
}
class _MyHomePage2State extends State<MyHomePage2> {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("page2"),
),
body : Center (
child : new RaisedButton(
child: const Text('Previous page'),
onPressed: () {
Navigator.push(
context,
new MaterialPageRoute(builder: (context) => new MyApp(
)),
);
}
)
)
);
}
}
обратите внимание: если я добавлю showMap (), как показано ниже, у меня нет проблем сдублирование карты, но всегда проблема с кнопкой возврата.Но в моем контексте мне нужно запускать карту только тогда, когда я получаю смс с локализацией, поэтому в конечном коде я не могу этого сделать.карта не хочет отображаться, потому что нет отображаемой локализации, потому что в этом случае после запуска карты получена sms-локализация.Также, если я закрою и перезапущу приложение, дублирование удаляется, но перезапускается, если я запускаю в другой раз файл navigator.push после запуска карты ...
onPressed: () {
//new SmsSender().sendSms(new SmsMessage(nirbinumber,"maps" )); //function to send sms after onPressed
MapView.setApiKey(" my google map api key ");
showMap();
},