Google Maps Flutter animateCamera引发错误

问题描述

我已成功将Google地图放置在Flutter应用程序上,但是无论何时位置更新触发,控制台上都会出现错误。该地图仍会更新,并且一切正常,但是我想完全理解为什么会出现此错误以及如何解决错误

下面是我的完整代码和控制台上显示错误

错误

E/Flutter (12290): [ERROR:Flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: MissingPluginException(No implementation found for method camera#animate on channel plugins.Flutter.io/google_maps_0)
E/Flutter (12290): #0      MethodChannel._invokeMethod (package:Flutter/src/services/platform_channel.dart:157:7)
E/Flutter (12290): <asynchronous suspension>
E/Flutter (12290): #1      MethodChannel.invokeMethod (package:Flutter/src/services/platform_channel.dart:332:12)
E/Flutter (12290): #2      MethodChannelGoogleMapsFlutter.animateCamera (package:google_maps_Flutter_platform_interface/src/method_channel/method_channel_google_maps_Flutter.dart:294:10)
E/Flutter (12290): #3      GoogleMapController.animateCamera (package:google_maps_Flutter/src/controller.dart:160:39)
E/Flutter (12290): #4      HomeState.getLocation.<anonymous closure> (package:harpy/activities/Home.activity.dart:45:20)
E/Flutter (12290): #5      _rootRunUnary (dart:async/zone.dart:1198:47)
E/Flutter (12290): #6      _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/Flutter (12290): #7      _CustomZone.runUnaryguarded (dart:async/zone.dart:1005:7)
E/Flutter (12290): #8      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/Flutter (12290): #9      _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/Flutter (12290): #10     _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:127:11)
E/Flutter (12290): #11     _MapStream._handleData (dart:async/stream_pipe.dart:224:10)
E/Flutter (12290): #12     _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:157:13)
E/Flutter (12290): #13     _rootRunUnary (dart:async/zone.dart:1198:47)
E/Flutter (12290): #14     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/Flutter (12290): #15     _CustomZone.runUnaryguarded (dart:async/zone.dart:1005:7)
E/Flutter (12290): #16     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/Flutter (12290): #17     _DelayedData.perform (dart:async/stream_impl.dart:611:14)
E/Flutter (12290): #18     _StreamImplEvents.handleNext (dart:async/stream_impl.dart:730:11)
E/Flutter (12290): #19     _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:687:7)
E/Flutter (12290): #20     _rootRun (dart:async/zone.dart:1182:47)
E/Flutter (12290): #21     _CustomZone.run (dart:async/zone.dart:1093:19)
E/Flutter (12290): #22     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/Flutter (12290): #23     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/Flutter (12290): #24     _rootRun (dart:async/zone.dart:1190:13)
E/Flutter (12290): #25     _CustomZone.run (dart:async/zone.dart:1093:19)
E/Flutter (12290): #26     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/Flutter (12290): #27     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/Flutter (12290): #28     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/Flutter (12290): #29     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
E/Flutter (12290): 
Restarted application in 4,395ms.

完整代码

import 'dart:async';

import 'package:Flutter/material.dart';
import 'package:Flutter/rendering.dart';
import 'package:google_maps_Flutter/google_maps_Flutter.dart';
import 'package:harpy/widgets/BottomSheet.widget.dart';
import 'package:harpy/widgets/Navigation.widget.dart';
import 'package:location/location.dart';


class Home extends StatefulWidget {
  @override
  State<Home> createState() => HomeState();

}

class HomeState extends State<Home> {
  BitmapDescriptor userLocationIcon;
  GoogleMapController mapController;
  Completer<GoogleMapController> _controller = Completer();
  Location _location = Location();
  LocationData _locationData;
  Map<MarkerId,Marker> markers = <MarkerId,Marker>{};
  Set<Marker> _markers = {};

  bool expand = false;
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  getLocation() async{
    mapController = await _controller.future;

    _location.onLocationChanged.listen((LocationData currentLocation) {
      LatLng latLng = LatLng(currentLocation.latitude,currentLocation.longitude);

      _markers.add(Marker(
          markerId: MarkerId("myLocation"),position: latLng,icon: userLocationIcon,rotation: currentLocation.heading)
      );

      CameraUpdate cameraUpdate = CameraUpdate.newLatLngZoom(latLng,17.4);

     mapController.animateCamera(cameraUpdate);

      setStateIfMounted(() {
        _locationData = currentLocation;
      });

    });
  }

  void setStateIfMounted(f) {
    if (mounted) setState(f);
  }

  onExpand(){
    setState(() { expand = !expand; });
  }

  Future<bool> _onWillPop() async {
    if(expand){
      setState(() { expand = false; });
      return false;
    }
    return true;
  }

  createMarkerImages(){
    BitmapDescriptor.fromAssetimage(
        ImageConfiguration(devicePixelRatio: 2.5),'assets/images/car.png').then((onValue) {
      userLocationIcon = onValue;
    });
  }

  @override
  void initState() {
    super.initState();
    createMarkerImages();
    getLocation();
  }

  @override
  void dispose() {
    super.dispose();
    mapController.dispose();
  }

  @override
  Widget build(BuildContext context) {
    Size _size = MediaQuery.of(context).size;
    return WillPopScope(
      onWillPop: _onWillPop,child: SafeArea(
        child: Scaffold(
          key: _scaffoldKey,drawer: Navigation(),body: Stack(
            children: <Widget>[
              Container(
                height: _size.height - (_size.height / 3),child: GoogleMap(
                    markers: _markers,myLocationEnabled: true,zoomControlsEnabled: false,myLocationButtonEnabled: false,mapType: MapType.normal,initialCameraPosition: CameraPosition(
                      target: LatLng(this._locationData?.latitude ?? 6.7008168,this._locationData?.longitude ?? -1.6998494),zoom: 14.4746,),onMapCreated: (GoogleMapController controller) {
                      _controller.complete(controller);
                    }
                ),Positioned(
                top: 20,left: 20,child: Container(
                  height: 45,width: 45,decoration: Boxdecoration(
                      color: Colors.white,borderRadius: BorderRadius.circular(25),BoxShadow: [
                        BoxShadow(
                            color: Colors.grey.withOpacity(0.3),spreadRadius: 3,blurRadius: 10,offset: Offset(0,1)
                        )
                      ]
                  ),child: IconButton(
                    icon: Icon(Icons.menu),onpressed: ()=> _scaffoldKey.currentState.openDrawer(),CustomBottomSheet(onpressed: onExpand,expand: expand)
            ],);
  }
}

解决方法

转到“文件”->“使缓存/重新启动无效”。

然后它将起作用。

,

我创建了一个流订阅变量;

StreamSubscription<LocationData> streamHandler;

将其引用到订阅,并在处置方法中将其取消

  @override
  void dispose() {
    super.dispose();
    mapController.dispose();
    streamHandler.cancel();
  }

我再也看不到错误了:)。