Как добавить Polyline на googleMapFlutter, когда карта уже построена?
У меня проблема с добавлением полилинии в google_map_flutter.
Я добавляю пакет в свой проект, создаю googlemap для класса. Все хорошо, я вижу карту Google на моем устройстве.
Я добавляю полилинию в сборке googlemap и это хорошо, я вижу полилинию.
Но как добавить полилинию, когда карта уже построена?
Я пытаюсь это сделать, но моя ломаная не отображается.
Мой код:
void aPolyline()
{
Log.printLogDebug("APOLYLINE()");
List<LatLng> latLngList = List();
LatLng _one = LatLng(43.623880, 3.898790);
LatLng _two = LatLng(43.623880, 3.91256);
LatLng _three = LatLng(43.56325, 3.898790);
LatLng _four = LatLng(43.53214, 3.872365);
latLngList.add(_one);
latLngList.add(_two);
latLngList.add(_three);
latLngList.add(_four);
Polyline po = Polyline(
polylineId: PolylineId('test'),
visible: true,
points: latLngList,
color: Colors.blue,
width: 2,
);
setState(()
{
_polyline.add(po);
});
}
Спасибо за вашу помощь.
2 ответа
Нет, я не использую тот же PolylineId, потому что я хочу видеть только одну Polyline. Я вижу Полилинию, когда она является экземпляром в сборке Googlemap, а когда я создаю экземпляр этой Полилинии с помощью метода (то есть после сборки), ее не видно.
Весь код GoogleMapW (W для виджета):
class GoogleMapsW extends StatefulWidget
{
void addPolyline() => _GoogleMapsW().ap();
_GoogleMapsW createState() => _GoogleMapsW();
}
class _GoogleMapsW extends State<GoogleMapsW>
{
// Le "completer" permet de charger un widget async Future.
Completer<GoogleMapController> _controller = Completer();
//GoogleMapController _controller ;
// Icone du floatingButton
IconData _iconFloating = Icons.filter_none;
// Type de map affichée
MapType _typeMap = MapType.normal;
// Position initiale de la caméra sur la map
final CameraPosition _initCameraPosition = CameraPosition(
target: LatLng(43.623880, 3.898790),
zoom: 18.0,
);
Set<Polyline> _polyline;
@override
Widget build(BuildContext context)
{
return Stack(
children: <Widget>
[
GoogleMap(
polylines: _polyline,
mapType: _typeMap,
initialCameraPosition: _initCameraPosition,
onMapCreated: aPolyline,
// onMapCreated: (GoogleMapController controller)
// {
// _controller.complete((controller));
// },
),
// Espacement entre le bouton et le bord de l'écran
Padding(
padding: EdgeInsets.all(16.0),
// Widget d'alignement
child: Align(
alignment: Alignment.bottomRight,
// Bouton de modification de la carte affichée
child: FloatingActionButton(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
child: Icon(_iconFloating,),
onPressed: () { _iconFloatingButton(context); }
),
),
),
],
);
}
///
/// Evènement d'appui sur le bouton de la carte.
/// Switche le type de carte affichée.
///
void _iconFloatingButton(BuildContext context)
{
if (mounted)
{
setState(()
{
// Si la carte affichée est de type normal, on affiche une vue satellite
if (_iconFloating == Icons.filter_none)
{
_iconFloating = Icons.satellite;
_typeMap = MapType.hybrid;
}
// Sinon c'est la carte de type satellite qui esr affichée, on remet l mode normal.
else
{
_iconFloating = Icons.filter_none;
_typeMap = MapType.normal;
}
});
}
}
Future<void> ap() async
{
List<LatLng> latLngList = List();
LatLng _one = LatLng(43.623880, 3.898790);
LatLng _two = LatLng(43.623880, 3.91256);
LatLng _three = LatLng(43.56325, 3.898790);
LatLng _four = LatLng(43.53214, 3.872365);
latLngList.add(_one);
latLngList.add(_two);
latLngList.add(_three);
latLngList.add(_four);
Polyline po = Polyline(
polylineId: PolylineId('test'),
visible: true,
points: latLngList,
color: Colors.blue,
width: 2,
);
aPolyline(await _controller.future, poly: po);
}
///
/// Ajout d'une polyline
///
void aPolyline(GoogleMapController mapController, {Polyline poly})
{
Log.printLogDebug("APOLYLINE()");
setState(()
{
_controller.complete((mapController));
if (poly != null)
{
_polyline.add(poly);
}
});
}
}
В этом классе, когда я нажимаю на плавающую кнопку, он меняет тип карты. Это работает.
class ViewMap extends StatefulWidget
{
@override
_ViewMap createState() => _ViewMap();
}
class _ViewMap extends State<ViewMap>
{
GoogleMapsW _googleMapsW = GoogleMapsW();
@override
Widget build(BuildContext context)
{
return Scaffold(
body:
Stack(
children: <Widget>[
// Carte google personnalisée.
_googleMapsW,
Center(
child: IconButton(
icon: Icon(Icons.flag),
onPressed: () { _googleMapsW.addPolyline(); },
),
),
],
),
),
};
}
"Центр" с IconButton просто для тестирования addPolilyne. В моем истинном решении эта кнопка не существует.
Извините за мои плохие выражения, но я француз и мой английский очень плох.
Вы используете тот же PolylineId? Попробуйте использовать другой PolylineId.
Вы также можете опубликовать весь код StatefulWidget, чтобы мы могли проверить его.