質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

1回答

1384閲覧

【Flutter】Google Mapで位置情報権限を許可した後に現在地を示す青丸が表示されない

dauto

総合スコア38

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2022/06/29 09:23

Flutterで初期地点を東京駅にしてGoogle Map表示した後に位置情報権限のウィンドウを表示し、許可された場合はGoogle MapのzoomControlsEnabledオプションを使用し現在地を表示されるよう実装したいと考えています。
Google Mapの表示、位置情報権限のウィンドウ表示、許可されたら現在地を取得する所までは実装できたのですが、現在地を表示することができません。

他の画面からマップ画面に移動するとGoogle Mapが再描画され現在地が表示される為、おそらくGoogle Mapが位置情報権限の許可前に描画した時のままで再描画ができていないのが原因だと思われるのですが、どのように修正すればいいのでしょうか。

コードは以下になります。

Dart

1import 'dart:async'; 2import 'package:flutter/cupertino.dart'; 3import 'package:flutter/material.dart'; 4import 'package:flutter_riverpod/flutter_riverpod.dart'; 5import 'package:shared_preferences/shared_preferences.dart'; 6import 'package:google_maps_flutter/google_maps_flutter.dart'; 7import 'package:geolocator/geolocator.dart'; 8 9import 'package:location_sharing_sns/model/map.dart'; 10 11class MapPage extends ConsumerStatefulWidget { 12 const MapPage({Key? key}) : super(key: key); 13 14 15 _MapPageState createState() => _MapPageState(); 16} 17 18class _MapPageState extends ConsumerState<MapPage> { 19 final Completer<GoogleMapController> _controller = Completer(); 20 StreamSubscription? positionStream; 21 bool _changePosition = false; 22 23 24 void initState() { 25 super.initState(); 26 final map = ref.read(mapProvider); 27 28 map.markers = {}; 29 map.circles = {}; 30 31 _getLocation(); 32 } 33 34 35 void dispose() { 36 positionStream?.cancel(); 37 super.dispose(); 38 } 39 40 41 Widget build(BuildContext context) { 42 final map = ref.watch(mapProvider); 43 44 return Scaffold( 45 body: FutureBuilder( 46 future: map.checkInitialPosition(), 47 builder: (context, initialPositionSnapshot) { 48 if(!initialPositionSnapshot.hasData) { 49 return const Center( 50 child: CupertinoActivityIndicator( 51 radius: 20, 52 ), 53 ); 54 } 55 56 final isSetInitialPosition = initialPositionSnapshot.data as bool; 57 58 return Stack( 59 children: [ 60 GoogleMap( 61 mapType: MapType.normal, 62 initialCameraPosition: CameraPosition( 63 target: map.currentPosition, 64 zoom: isSetInitialPosition ? 18 : 5, 65 ), 66 onMapCreated: (GoogleMapController controller) { 67 _controller.complete(controller); 68 }, 69 onCameraMove: (CameraPosition position) { 70 map.centerPosition = position.target; 71 }, 72 onCameraIdle: () { 73 setState(() { 74 _changePosition = true; 75 }); 76 }, 77 markers: map.markers, 78 circles: map.circles, 79 myLocationEnabled: true, 80 myLocationButtonEnabled: false, 81 zoomControlsEnabled: false, 82 ), 83 SafeArea( 84 child: Align( 85 alignment: Alignment.topCenter, 86 child: AnimatedOpacity( 87 opacity: _changePosition ? 1.0 : 0.0, 88 duration: const Duration(milliseconds: 300), 89 child: ElevatedButton( 90 style: ElevatedButton.styleFrom( 91 primary: Colors.white, 92 onPrimary: Colors.black, 93 shape: const StadiumBorder(), 94 splashFactory: InkRipple.splashFactory, 95 ), 96 onPressed: () => _getMarkers(), 97 child: const Text( 98 'このエリアを検索', 99 style: TextStyle( 100 color: Colors.black, 101 ), 102 ), 103 ), 104 ), 105 ), 106 ), 107 ], 108 ); 109 }, 110 ), 111 floatingActionButton: Column( 112 mainAxisSize: MainAxisSize.min, 113 children: [ 114 Container( 115 height: 50.0, 116 width: 50.0, 117 margin: const EdgeInsets.only(bottom: 10), 118 child: FloatingActionButton( 119 heroTag: "currentPosition", 120 backgroundColor: Colors.white, 121 foregroundColor: Colors.black87, 122 onPressed: () => _getLocation(), 123 child: const Icon(Icons.my_location_outlined), 124 ), 125 ), 126 ], 127 ), 128 ); 129 } 130 131 _getLocation() async { 132 final SharedPreferences prefs = await SharedPreferences.getInstance(); 133 final map = ref.read(mapProvider); 134 135 // 位置情報のアクセス許可 136 final checkLocation = await map.checkLocation(); 137 138 if (checkLocation) { 139 final currentPosition = await Geolocator.getCurrentPosition( 140 desiredAccuracy: LocationAccuracy.best); 141 142 prefs.setDouble('currentPositionLatitude', currentPosition.latitude); 143 prefs.setDouble('currentPositionLongitude', currentPosition.longitude); 144 145 final latLngCurrentPosition = 146 LatLng(currentPosition.latitude, currentPosition.longitude); 147 148 setState(() { 149 map.currentPosition = latLngCurrentPosition; 150 }); 151 152 setState(() {}); 153 154 _moveCamera(latLngCurrentPosition); 155 _getMarkers(); 156 157 _getLocationStream(); 158 } 159 } 160 161 _getLocationStream() async { 162 final map = ref.read(mapProvider); 163 164 const locationSettings = LocationSettings( 165 accuracy: LocationAccuracy.best, 166 ); 167 168 positionStream = 169 Geolocator.getPositionStream(locationSettings: locationSettings) 170 .listen((Position position) async { 171 final SharedPreferences prefs = await SharedPreferences.getInstance(); 172 173 prefs.setDouble('currentPositionLatitude', position.latitude); 174 prefs.setDouble('currentPositionLongitude', position.longitude); 175 176 final currentPosition = LatLng(position.latitude, position.longitude); 177 178 await map.setUserCircle(currentPosition); 179 180 if (map.currentPosition != currentPosition) { 181 map.currentPosition = currentPosition; 182 await _getMarkers(); 183 } 184 }); 185 } 186 187 _getMarkers() async { 188 final map = ref.watch(mapProvider); 189 final GoogleMapController controller = await _controller.future; 190 191 final region = await controller.getVisibleRegion(); 192 193 setState(() { 194 map.getMarkers(context, map.centerPosition!, region); 195 _changePosition = false; 196 }); 197 } 198 199 _moveCamera(position) async { 200 try { 201 final GoogleMapController controller = await _controller.future; 202 203 await controller.animateCamera( 204 CameraUpdate.newCameraPosition( 205 CameraPosition( 206 target: position, 207 zoom: 18.0, 208 ), 209 ), 210 ); 211 212 return true; 213 } catch (e) { 214 return false; 215 } 216 } 217} 218

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

現在地を表示したいタイミングでControllerのanimateCamera関数で移動するのはいかがでしょうか?

Dart

1_controller.animateCamera(CameraUpdate.newCameraPosition(map.currentPosition));

投稿2022/07/02 01:42

harakazu

総合スコア150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dauto

2022/07/02 06:05 編集

回答ありがとうございます。 ご指摘いただいたanimateCameraはコード下部のmoveCameraという関数で実行しており、正常にGoogle mapの視点は移動しています。 ですが視点が移動のみでユーザーの現在地を表す青い丸は表示されない状況です。
harakazu

2022/07/02 07:26

質問の意味を取り違えていました。 _moveCamera(latLngCurrentPosition); をsetStateの中で実行してみたらいかがでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問