回答編集履歴

1

Completerを使っていた部分をnull許容変数に変更しました。このような場面でCompleterはないかなと思うので。

2023/05/24 09:05

投稿

ta.fu
ta.fu

スコア1676

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ```dart
4
4
  class MapSampleState extends State<MapSample> with WidgetsBindingObserver {
5
- final Completer<GoogleMapController> _controller = Completer();
5
+ GoogleMapController? _controller;
6
6
  final String _light = "[]";
7
7
  late String _dark;
8
8
 
@@ -15,8 +15,8 @@
15
15
  WidgetsBinding.instance.addObserver(this);
16
16
  }
17
17
 
18
- Future<void> _setMapStyle(GoogleMapController value) {
18
+ void _setMapStyle() {
19
- return value.setMapStyle(
19
+ _controller?.setMapStyle(
20
20
  PlatformDispatcher.instance.platformBrightness == Brightness.light
21
21
  ? _light
22
22
  : _dark);
@@ -30,7 +30,7 @@
30
30
 
31
31
  @override
32
32
  void didChangePlatformBrightness() {
33
- _controller.future.then((value) => _setMapStyle(value));
33
+ _setMapStyle();
34
34
  }
35
35
 
36
36
  @override
@@ -42,8 +42,8 @@
42
42
  target: LatLng(37.42796133580664, -122.085749655962),
43
43
  ),
44
44
  onMapCreated: (GoogleMapController controller) {
45
- _setMapStyle(controller);
46
- _controller.complete(controller);
45
+ _controller = controller;
46
+ _setMapStyle();
47
47
  },
48
48
  ),
49
49
  );
@@ -60,3 +60,8 @@
60
60
  Androidで試したけどiOSでもたぶん同じだと思う(思いたい)。
61
61
 
62
62
  提示された実装ではbuildメソッド内でui.window.platformBrightness == Brightness.lightで構築するウィジェットを切り替えようとしているけど、これは生成されるウィジェットは同一と判断されるので、State側は再構築されずonMapCreatedは呼び出されないのでスタイルの変更は行われないという状況になっている。
63
+
64
+ ---
65
+ 実装を一部修正。
66
+ Completerを使っていた部分をnull許容変数に変更。
67
+ google_maps_flutterのトップページにあるサンプルではCompleterを使っているのだけど、github側の例はほとんどが?のnull許容変数を使っていたのと、このような使い方でCompleterは適当ではないと思い変更しました。