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

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

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

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

Q&A

0回答

1049閲覧

flutter beaconでRegionを初期化できない。

Tetsukick

総合スコア297

Flutter

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

0グッド

0クリップ

投稿2020/04/10 08:30

前提・実現したいこと

Flutter beacon パッケージを使用して、iBeaconの観測アプリケーションを作成しています。
イメージ説明 イメージ説明 

画像のTextFieldにiBeaconのUUIDを入力して、検索ボタンを押下すると、そのUUIDに合致したiBeaconの詳細情報が一覧で表示されるようなものをを作成しています。

発生している問題・エラーメッセージ

UUIDを変更しても、元のUUIDでRangingをし続けてしまいます。

該当のソースコード

BeaconBloc()イニシャライザ内で、UUIDをListenして、変更がある度に
_streamRangingを初期化しています。

Dart

1import 'dart:io'; 2 3import 'dart:async'; 4import 'package:flutter/widgets.dart'; 5import 'package:rxdart/rxdart.dart'; 6 7import 'package:flutter/services.dart'; 8import 'package:flutter_beacon/flutter_beacon.dart'; 9 10class BeaconBloc with WidgetsBindingObserver { 11 // input 12 final _lifeCycleActionController = BehaviorSubject<bool>(); 13 Sink<void> get changeLifeCycleAction => _lifeCycleActionController.sink; 14 15 final _UUIDTextFieldController = BehaviorSubject<String>(); 16 Stream<String> get uuid => _UUIDTextFieldController.stream; 17 StreamSink<String> get changeUUIDAction => _UUIDTextFieldController.sink; 18 19 //output 20 final _authorizationStatusController = BehaviorSubject<bool>(); 21 Stream<bool> get authorizationStatus => _authorizationStatusController.stream; 22 23 final _locationServiceEnabledController = BehaviorSubject<bool>(); 24 Stream<bool> get locationServiceEnabled => _locationServiceEnabledController.stream; 25 26 final _bluetoothEnabledController = BehaviorSubject<bool>(); 27 Stream<bool> get bluetoothEnabled => _bluetoothEnabledController.stream; 28 29// final _UUIDController = BehaviorSubject<String>(); 30// Stream<String> get uuid => _UUIDController.stream; 31 32 final _beaconsController = BehaviorSubject<List<Beacon>>(); 33 Stream<List<Beacon>> get beacons => _beaconsController.stream; 34 35 static final Map<String, dynamic> _items = <String, dynamic>{}; 36 37 final StreamController<BluetoothState> streamController = StreamController(); 38 StreamSubscription<BluetoothState> _streamBluetooth; 39 StreamSubscription<RangingResult> _streamRanging; 40 Map<Region, List<Beacon>> _regionBeacons = <Region, List<Beacon>>{}; 41 List<Beacon> _beacons = <Beacon>[]; 42 bool authorizationStatusOk = false; 43 bool internalLocationServiceEnabled = false; 44 bool internalBluetoothEnabled = false; 45 String _proximityUUID = ''; 46 47 BeaconBloc() { 48 WidgetsBinding.instance.addObserver(this); 49 listeningState(); 50 51 uuid.listen((text) async { 52 print('text: ' + text); 53 _proximityUUID = text; 54 _beacons.clear(); 55 _regionBeacons = <Region, List<Beacon>>{}; 56 _beaconsController.sink.add(_beacons); 57 if (_streamRanging != null) { 58 _streamRanging.cancel(); 59 _streamRanging = null; 60 } 61 62 await checkAllRequirements(); 63 if (authorizationStatusOk && internalLocationServiceEnabled && internalBluetoothEnabled) { 64 await initScanBeacon(); 65 } 66 }); 67 } 68 69 70 void didChangeAppLifecycleState(AppLifecycleState state) async { 71 print('AppLifecycleState = $state'); 72 if (state == AppLifecycleState.resumed) { 73 if (_streamBluetooth != null && _streamBluetooth.isPaused) { 74 _streamBluetooth.resume(); 75 } 76 await checkAllRequirements(); 77 if (authorizationStatusOk && internalLocationServiceEnabled && internalBluetoothEnabled) { 78// await initScanBeacon(); 79 } else { 80 await pauseScanBeacon(); 81 await checkAllRequirements(); 82 } 83 } else if (state == AppLifecycleState.paused) { 84 _streamBluetooth.pause(); 85 } 86 } 87 88 listeningState() async { 89 print('Listening to bluetooth state'); 90 _streamBluetooth = flutterBeacon 91 .bluetoothStateChanged() 92 .listen((BluetoothState state) async { 93 print('BluetoothState = $state'); 94 streamController.add(state); 95 96 switch (state) { 97 case BluetoothState.stateOn: 98 initScanBeacon(); 99 break; 100 case BluetoothState.stateOff: 101 await pauseScanBeacon(); 102 await checkAllRequirements(); 103 break; 104 } 105 }); 106 } 107 108 void dispose() { 109 WidgetsBinding.instance.removeObserver(this); 110 111 _lifeCycleActionController.close(); 112 _authorizationStatusController.close(); 113 _locationServiceEnabledController.close(); 114 _bluetoothEnabledController.close(); 115 _beaconsController.close(); 116 } 117 118 initScanBeacon() async { 119// await flutterBeacon.initializeScanning; 120 await checkAllRequirements(); 121 if (!authorizationStatusOk || 122 !internalLocationServiceEnabled || 123 !internalBluetoothEnabled) { 124 print('RETURNED, authorizationStatusOk=$authorizationStatusOk, ' 125 'locationServiceEnabled=$internalLocationServiceEnabled, ' 126 'bluetoothEnabled=$internalBluetoothEnabled'); 127 return; 128 } 129 print('scan status is OK'); 130 131 print('uuid: ' + _proximityUUID); 132 var regions = <Region>[ 133 Region( 134 identifier: 'Cubeacon', 135 proximityUUID: _proximityUUID, 136 ), 137 ]; 138 139 if (_streamRanging != null) { 140 if (_streamRanging.isPaused) { 141 _streamRanging.resume(); 142 return; 143 } 144 } 145 146 print('start ranging'); 147 print(regions); 148 _streamRanging = 149 flutterBeacon.ranging(regions).listen((RangingResult result) { 150 print(result); 151 if (result != null) { 152 _regionBeacons[result.region] = result.beacons; 153 _beacons.clear(); 154 _regionBeacons.values.forEach((list) { 155 print('beacons'); 156 print(list); 157 _beacons.addAll(list); 158 }); 159 _beacons.sort(_compareParameters); 160 print(_beacons); 161 162 _beaconsController.sink.add(_beacons); 163 } 164 }); 165 } 166 167 pauseScanBeacon() async { 168 _streamRanging?.pause(); 169 if (_beacons.isNotEmpty) { 170 _beacons.clear(); 171 172 _beaconsController.sink.add(_beacons); 173 } 174 } 175 176 checkAllRequirements() async { 177 final bluetoothState = await flutterBeacon.bluetoothState; 178 internalBluetoothEnabled = bluetoothState == BluetoothState.stateOn; 179 final authorizationStatus = await flutterBeacon.authorizationStatus; 180 authorizationStatusOk = 181 authorizationStatus == AuthorizationStatus.allowed || 182 authorizationStatus == AuthorizationStatus.always; 183 internalLocationServiceEnabled = 184 await flutterBeacon.checkLocationServicesIfEnabled; 185 186 _bluetoothEnabledController.sink.add(internalBluetoothEnabled); 187 _authorizationStatusController.sink.add(authorizationStatusOk); 188 _locationServiceEnabledController.sink.add(internalLocationServiceEnabled); 189 } 190 191 int _compareParameters(Beacon a, Beacon b) { 192 int compare = a.proximityUUID.compareTo(b.proximityUUID); 193 194 if (compare == 0) { 195 compare = a.major.compareTo(b.major); 196 } 197 198 if (compare == 0) { 199 compare = a.minor.compareTo(b.minor); 200 } 201 202 return compare; 203 } 204} 205

試したこと

flutterBeacon.initializeScanning;を実施して初期化を試みようとしましたが、、
以下のerrorが発生してしまいます。

Unhandled Exception: Invalid argument(s)

補足情報(FW/ツールのバージョンなど)

ソースはこちら↓↓↓
https://github.com/Tetsukick/Beacon_Tester

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問