Google maps controller无法初始化,flutter 2.8.1 google_maps_flutter 2.1.1
Google maps controller cannot be initialized, flutter 2.8.1 google_maps_flutter 2.1.1
我在 Stack Overflow 上再次提问 :),当我尝试创建一个 GoogleMapsController 变量时它显示了这个
Non-nullable instance field 'googleMapController' must be initialized.
Try adding an initializer expression, or a generative constructor that initializes it, or mark it 'late'
我的控制器
GoogleMapController googleMapController;
如果我使用这个
Completer<GoogleMapController> _controller = Completer();
未定义完成者
如果我使用
late GoogleMapController googleMapController;
使用控制器时会报错
LateError (LateInitializationError: Field 'googleMapController' has not been initialized.)
我不明白为什么 youtube 上的人没有收到这样的错误
由于空安全性,您的变量必须在创建时初始化,
如果您使用的是 Flutter 2.5.3 及更高版本,您可以使用 late 来告诉它它将在创建之后但在使用之前进行初始化(这就是为什么 YouTube 上的人没有收到任何这样的错误如果他们没有迟到):
late final Completer<GoogleMapController> _controller = Completer();
这里是使用相同版本 flutter 2.8.1 的完整示例,google_maps_flutter 2.1.1
class MapController extends StatefulWidget {
const MapController({Key? key}) : super(key: key);
@override
_MapControllerState createState() => _MapControllerState();
}
class _MapControllerState extends State<MapController> {
late final Completer<GoogleMapController> _controller = Completer();
static CameraPosition get _kGooglePlex => const CameraPosition(
target: LatLng(37.42796133580664, -122.085749655962),
zoom: 14.4746,
);
static CameraPosition get _kLake => const CameraPosition(
bearing: 192.8334901395799,
target: LatLng(37.43296265331129, -122.08832357078792),
tilt: 59.440717697143555,
zoom: 19.151926040649414);
@override
Widget build(BuildContext context) {
return Scaffold(
body: GoogleMap(
mapType: MapType.hybrid,
initialCameraPosition: _kGooglePlex,
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
),
floatingActionButton: FloatingActionButton.extended(
onPressed: _goToTheLake,
label: const Text('To the lake!'),
icon: const Icon(Icons.directions_boat),
),
);
}
Future<void> _goToTheLake() async {
final GoogleMapController controller = await _controller.future;
controller.animateCamera(CameraUpdate.newCameraPosition(_kLake));
}
我在 Stack Overflow 上再次提问 :),当我尝试创建一个 GoogleMapsController 变量时它显示了这个
Non-nullable instance field 'googleMapController' must be initialized.
Try adding an initializer expression, or a generative constructor that initializes it, or mark it 'late'
我的控制器
GoogleMapController googleMapController;
如果我使用这个
Completer<GoogleMapController> _controller = Completer();
未定义完成者
如果我使用
late GoogleMapController googleMapController;
使用控制器时会报错
LateError (LateInitializationError: Field 'googleMapController' has not been initialized.)
我不明白为什么 youtube 上的人没有收到这样的错误
由于空安全性,您的变量必须在创建时初始化,
如果您使用的是 Flutter 2.5.3 及更高版本,您可以使用 late 来告诉它它将在创建之后但在使用之前进行初始化(这就是为什么 YouTube 上的人没有收到任何这样的错误如果他们没有迟到):
late final Completer<GoogleMapController> _controller = Completer();
这里是使用相同版本 flutter 2.8.1 的完整示例,google_maps_flutter 2.1.1
class MapController extends StatefulWidget {
const MapController({Key? key}) : super(key: key);
@override
_MapControllerState createState() => _MapControllerState();
}
class _MapControllerState extends State<MapController> {
late final Completer<GoogleMapController> _controller = Completer();
static CameraPosition get _kGooglePlex => const CameraPosition(
target: LatLng(37.42796133580664, -122.085749655962),
zoom: 14.4746,
);
static CameraPosition get _kLake => const CameraPosition(
bearing: 192.8334901395799,
target: LatLng(37.43296265331129, -122.08832357078792),
tilt: 59.440717697143555,
zoom: 19.151926040649414);
@override
Widget build(BuildContext context) {
return Scaffold(
body: GoogleMap(
mapType: MapType.hybrid,
initialCameraPosition: _kGooglePlex,
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
),
floatingActionButton: FloatingActionButton.extended(
onPressed: _goToTheLake,
label: const Text('To the lake!'),
icon: const Icon(Icons.directions_boat),
),
);
}
Future<void> _goToTheLake() async {
final GoogleMapController controller = await _controller.future;
controller.animateCamera(CameraUpdate.newCameraPosition(_kLake));
}