我想使用mapbox_navigation
包,但当我在一个新的Flutter项目中粘贴示例时,我得到了这个错误:
E/flutter (11145): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: PlatformException(error, java.lang.IllegalStateException: Trying to create a platform view of unregistered type: umair.mapbox_navigation/mapboxMapView
E/flutter (11145): at io.flutter.plugin.platform.PlatformViewsController$1.createVirtualDisplayForPlatformView(PlatformViewsController.java:199)
E/flutter (11145): at io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.create(PlatformViewsChannel.java:104)
E/flutter (11145): at io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.onMethodCall(PlatformViewsChannel.java:59)
E/flutter (11145): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/flutter (11145): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/flutter (11145): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:692)
E/flutter (11145): at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter (11145): at android.os.MessageQueue.next(MessageQueue.java:325)
E/flutter (11145): at android.os.Looper.loop(Looper.java:142)
E/flutter (11145): at android.app.ActivityThread.main(ActivityThread.java:6944)
E/flutter (11145): at java.lang.reflect.Method.invoke(Native Method)
E/flutter (11145): at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
E/flutter (11145): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
E/flutter (11145): , null, null)
E/flutter (11145): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:582:7)
E/flutter (11145): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:159:18)
E/flutter (11145): <asynchronous suspension>
E/flutter (11145): #2 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:332:12)
E/flutter (11145): #3 TextureAndroidViewController._sendCreateMessage (package:flutter/src/services/platform_views.dart:1039:54)
E/flutter (11145): #4 AndroidViewController.create (package:flutter/src/services/platform_views.dart:749:11)
E/flutter (11145): #5 TextureAndroidViewController.create (package:flutter/src/services/platform_views.dart:1018:34)
E/flutter (11145): #6 TextureAndroidViewController.setSize (package:flutter/src/services/platform_views.dart:1002:14)
E/flutter (11145): #7 RenderAndroidView._sizePlatformView (package:flutter/src/rendering/platform_view.dart:174:29)
E/flutter (11145): #8 RenderAndroidView.performResize (package:flutter/src/rendering/platform_view.dart:155:5)
E/flutter (11145): #9 RenderObject.layout (package:flutter/src/rendering/object.dart:1756:9)
E/flutter (11145): #10 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:113:14)
E/flutter (11145): #11 RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
E/flutter (11145): #12 RenderStack.performLayout (package:flutter/src/rendering/stack.dart:560:15)
E/flutter (11145): #13 RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
E/flutter (11145): #14 MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:171:12)
E/flutter (11145): #15 _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:498:7)
E/flutter (11145): #16 MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:243:7)
E/flutter (11145): #17 RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:402:14)
E/flutter (11145): #18 RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
E/flutter (11145): #19 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:113:14)
E/flutter (11145): #20 RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
E/flutter (11145): #21 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:113:14)
E/flutter (11145): #22 _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1308:11)
E/flutter (11145): #23 RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
E/flutter (11145): #24 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:113:14)
E/flutter (11145): #25 RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
E/flutter (11145): #26 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:113:14)
E/flutter (11145): #27 RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
E/flutter (11145): #28 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:113:14)
E/flutter (11145): #29 RenderObject.layout (package:flutter/src
我的代码:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:mapbox_navigation/mapbox_navigation.dart';
void main() {
runApp(MaterialApp(
home: MainPage(),
));
}
class MainPage extends StatefulWidget {
@override
_MainPageState createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
MapViewController controller;
var mapBox = MapboxNavigation();
var isLoading = false;
var isRouteInProgress = false;
@override
void initState() {
super.initState();
mapBox.init();
mapBox.getMapBoxEventResults().onData((data) {
printWrapped("Event: ${data.eventName}, Data: ${data.data}");
var event = MapBoxEventProvider.getEventType(data.eventName);
if (event == MapBoxEvent.route_building) {
setState(() {
isLoading = true;
});
print("Building route..");
} else if (event == MapBoxEvent.route_build_failed) {
setState(() {
isLoading = false;
});
print("Route building failed.");
} else if (event == MapBoxEvent.route_built) {
setState(() {
isLoading = false;
});
var routeResponse = MapBoxRouteResponse.fromJson(jsonDecode(data.data));
controller.getFormattedDistance(routeResponse.routes.first.distance)
.then((value) => print("Route Distance: $value"));
controller.getFormattedDuration(routeResponse.routes.first.duration)
.then((value) => print("Route Duration: $value"));
} else if (event == MapBoxEvent.progress_change) {
setState(() {
isRouteInProgress = true;
});
var progressEvent = MapBoxProgressEvent.fromJson(jsonDecode(data.data));
controller.getFormattedDistance(progressEvent.legDistanceRemaining)
.then((value) => print("Leg Distance Remaining: $value"));
controller.getFormattedDistance(progressEvent.distanceTraveled)
.then((value) => print("Distance Travelled: $value"));
controller.getFormattedDuration(progressEvent.legDurationRemaining)
.then((value) => print("Leg Duration Remaining: $value"));
print(
"Instruction: ${progressEvent.currentStepInstruction},"
"Current Direction: ${progressEvent.currentDirection}");
} else if (event == MapBoxEvent.milestone_event) {
var mileStoneEvent = MapBoxMileStoneEvent.fromJson(jsonDecode(data.data));
controller.getFormattedDistance(mileStoneEvent.distanceTraveled)
.then((value) => print("Distance Travelled: $value"));
} else if (event == MapBoxEvent.speech_announcement) {
var speechEvent = MapBoxEventData.fromJson(jsonDecode(data.data));
print("Speech Text: ${speechEvent.data}");
} else if (event == MapBoxEvent.banner_instruction) {
var bannerEvent = MapBoxEventData.fromJson(jsonDecode(data.data));
print("Banner Text: ${bannerEvent.data}");
} else if (event == MapBoxEvent.navigation_cancelled) {
setState(() {
isRouteInProgress = false;
});
} else if (event == MapBoxEvent.navigation_finished) {
setState(() {
isRouteInProgress = false;
});
} else if (event == MapBoxEvent.on_arrival) {
setState(() {
isRouteInProgress = false;
});
} else if (event == MapBoxEvent.user_off_route) {
var locationData = MapBoxLocation.fromJson(jsonDecode(data.data));
print("User has off-routed: Location: ${locationData.toString()}");
} else if (event == MapBoxEvent.faster_route_found) {
var routeResponse = MapBoxRouteResponse.fromJson(jsonDecode(data.data));
controller.getFormattedDistance(routeResponse.routes.first.distance)
.then((value) => print("Faster route found: Route Distance: $value"));
controller.getFormattedDuration(routeResponse.routes.first.duration)
.then((value) => print("Faster route found: Route Duration: $value"));
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('MapBox Demo'),
),
body: Stack(
children: <Widget>[
MapBoxMapView(onMapViewCreated: _onMapViewCreated),
!isLoading
? Align(
alignment: Alignment.bottomCenter,
child: !isRouteInProgress
? Column(
children: <Widget>[
Row(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
RaisedButton(
child: Text("Add Marker"),
color: Colors.blue,
textColor: Colors.white,
onPressed: () async {
await controller.addMarker(
latitude: 33.569126,
longitude: 73.1231471);
await controller.moveCameraToPosition(
latitude: 33.569126,
longitude: 73.1231471);
}),
RaisedButton(
child: Text("Move Camera"),
color: Colors.blue,
textColor: Colors.white,
onPressed: () async {
await controller.moveCameraToPosition(
latitude: 33.6392443,
longitude: 73.278358);
})
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
RaisedButton(
child: Text("Build Route"),
color: Colors.blue,
textColor: Colors.white,
onPressed: () async {
setState(() {
isLoading = true;
});
print("My controller: $controller");
await controller.buildRoute(
originLat: 46.320324,
originLong: -0.581215,
destinationLat: 46.319783,
destinationLong: -0.584455,
zoom: 9.5);
}),
RaisedButton(
child: Text("Navigate"),
color: Colors.blue,
textColor: Colors.white,
onPressed: () async {
await controller.startNavigation(
shouldSimulateRoute: true);
}),
RaisedButton(
child: Text("Navigate Embedded"),
color: Colors.blue,
textColor: Colors.white,
onPressed: () async {
await controller
.startEmbeddedNavigation(
zoom: 18.0,
tilt: 90.0,
bearing: 50.0,
shouldSimulateRoute: true);
})
],
)
],
)
: RaisedButton(
child: Text("Cancel Navigation"),
color: Colors.blue,
textColor: Colors.white,
onPressed: () async {
setState(() {
isRouteInProgress = false;
isLoading = false;
});
await controller.stopNavigation();
}),
)
: Align(
alignment: Alignment.center,
child: CircularProgressIndicator()),
],
),
);
}
void _onMapViewCreated(MapViewController _controller) async {
print("MapView is created");
this.controller = _controller;
await controller.showMap(MapBoxOptions(
initialLat: 33.569126,
initialLong: 73.1231471,
enableRefresh: true,
alternatives: true,
zoom: 13.0,
tilt: 0.0,
bearing: 0.0,
clientAppName: "MapBox Demo",
voiceInstructions: true,
bannerInstructions: true,
continueStraight: false,
profile: "driving-traffic",
language: "en",
testRoute: "",
debug: true));
}
void printWrapped(String text) {
final pattern = RegExp('.{1,800}'); // 800 is the size of each chunk
pattern.allMatches(text).forEach((match) => print(match.group(0)));
}
}
我的Flutter医生:
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 1.22.0, on Linux, locale en_US.utf8)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
[✓] Android Studio (version 4.0)
[✓] Connected device (1 available)
• No issues found!
我的pubsec.yaml依赖项:
dependencies:
flutter:
sdk: flutter
mapbox_navigation: ^1.0.4
我想我只是在使用mapbox naviagtion
包时错过了一步,但我没有发现其他指定使用它的内容
如果我错了,请注意
感谢阅读
我将结束这个问题,因为这对包的作者来说似乎是一个错误。我根本没有找到答案,所以我要尝试另一个包,希望它能起作用
否则我会辞职使用谷歌地图