Как добавить 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, чтобы мы могли проверить его.

Другие вопросы по тегам