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

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

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

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

Dart

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

受付中

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

dauto
dauto

総合スコア38

Flutter

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

Dart

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

1回答

0評価

0クリップ

165閲覧

投稿2022/06/29 09:23

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

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

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

Dart

import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:geolocator/geolocator.dart'; import 'package:location_sharing_sns/model/map.dart'; class MapPage extends ConsumerStatefulWidget { const MapPage({Key? key}) : super(key: key); _MapPageState createState() => _MapPageState(); } class _MapPageState extends ConsumerState<MapPage> { final Completer<GoogleMapController> _controller = Completer(); StreamSubscription? positionStream; bool _changePosition = false; void initState() { super.initState(); final map = ref.read(mapProvider); map.markers = {}; map.circles = {}; _getLocation(); } void dispose() { positionStream?.cancel(); super.dispose(); } Widget build(BuildContext context) { final map = ref.watch(mapProvider); return Scaffold( body: FutureBuilder( future: map.checkInitialPosition(), builder: (context, initialPositionSnapshot) { if(!initialPositionSnapshot.hasData) { return const Center( child: CupertinoActivityIndicator( radius: 20, ), ); } final isSetInitialPosition = initialPositionSnapshot.data as bool; return Stack( children: [ GoogleMap( mapType: MapType.normal, initialCameraPosition: CameraPosition( target: map.currentPosition, zoom: isSetInitialPosition ? 18 : 5, ), onMapCreated: (GoogleMapController controller) { _controller.complete(controller); }, onCameraMove: (CameraPosition position) { map.centerPosition = position.target; }, onCameraIdle: () { setState(() { _changePosition = true; }); }, markers: map.markers, circles: map.circles, myLocationEnabled: true, myLocationButtonEnabled: false, zoomControlsEnabled: false, ), SafeArea( child: Align( alignment: Alignment.topCenter, child: AnimatedOpacity( opacity: _changePosition ? 1.0 : 0.0, duration: const Duration(milliseconds: 300), child: ElevatedButton( style: ElevatedButton.styleFrom( primary: Colors.white, onPrimary: Colors.black, shape: const StadiumBorder(), splashFactory: InkRipple.splashFactory, ), onPressed: () => _getMarkers(), child: const Text( 'このエリアを検索', style: TextStyle( color: Colors.black, ), ), ), ), ), ), ], ); }, ), floatingActionButton: Column( mainAxisSize: MainAxisSize.min, children: [ Container( height: 50.0, width: 50.0, margin: const EdgeInsets.only(bottom: 10), child: FloatingActionButton( heroTag: "currentPosition", backgroundColor: Colors.white, foregroundColor: Colors.black87, onPressed: () => _getLocation(), child: const Icon(Icons.my_location_outlined), ), ), ], ), ); } _getLocation() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); final map = ref.read(mapProvider); // 位置情報のアクセス許可 final checkLocation = await map.checkLocation(); if (checkLocation) { final currentPosition = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.best); prefs.setDouble('currentPositionLatitude', currentPosition.latitude); prefs.setDouble('currentPositionLongitude', currentPosition.longitude); final latLngCurrentPosition = LatLng(currentPosition.latitude, currentPosition.longitude); setState(() { map.currentPosition = latLngCurrentPosition; }); setState(() {}); _moveCamera(latLngCurrentPosition); _getMarkers(); _getLocationStream(); } } _getLocationStream() async { final map = ref.read(mapProvider); const locationSettings = LocationSettings( accuracy: LocationAccuracy.best, ); positionStream = Geolocator.getPositionStream(locationSettings: locationSettings) .listen((Position position) async { final SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setDouble('currentPositionLatitude', position.latitude); prefs.setDouble('currentPositionLongitude', position.longitude); final currentPosition = LatLng(position.latitude, position.longitude); await map.setUserCircle(currentPosition); if (map.currentPosition != currentPosition) { map.currentPosition = currentPosition; await _getMarkers(); } }); } _getMarkers() async { final map = ref.watch(mapProvider); final GoogleMapController controller = await _controller.future; final region = await controller.getVisibleRegion(); setState(() { map.getMarkers(context, map.centerPosition!, region); _changePosition = false; }); } _moveCamera(position) async { try { final GoogleMapController controller = await _controller.future; await controller.animateCamera( CameraUpdate.newCameraPosition( CameraPosition( target: position, zoom: 18.0, ), ), ); return true; } catch (e) { return false; } } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Flutter

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

Dart

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