flutter_blue_beacon 0.0.2 flutter_blue_beacon: ^0.0.2 copied to clipboard
A Eddystone and iBeacon implementation native to flutter using the flutter_blue plugin.
// Copyright 2017, Paul DeMarco.
// All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
import 'package:flutter_blue_beacon_example/widgets.dart';
import 'package:flutter_blue_beacon/flutter_blue_beacon.dart';
void main() {
runApp(new FlutterBlueApp());
}
class FlutterBlueApp extends StatefulWidget {
FlutterBlueApp({Key key, this.title}) : super(key: key);
final String title;
@override
_FlutterBlueAppState createState() => new _FlutterBlueAppState();
}
class _FlutterBlueAppState extends State<FlutterBlueApp> {
FlutterBlueBeacon flutterBlueBeacon = FlutterBlueBeacon.instance;
FlutterBlue _flutterBlue = FlutterBlue.instance;
/// Scanning
StreamSubscription _scanSubscription;
Map<int, Beacon> beacons = new Map();
bool isScanning = false;
/// State
StreamSubscription _stateSubscription;
BluetoothState state = BluetoothState.unknown;
@override
void initState() {
super.initState();
// Immediately get the state of FlutterBlue
_flutterBlue.state.then((s) {
setState(() {
state = s;
});
});
// Subscribe to state changes
_stateSubscription = _flutterBlue.onStateChanged().listen((s) {
setState(() {
state = s;
});
});
}
@override
void dispose() {
_stateSubscription?.cancel();
_stateSubscription = null;
_scanSubscription?.cancel();
_scanSubscription = null;
super.dispose();
}
_clearAllBeacons() {
setState(() {
beacons = Map<int, Beacon>();
});
}
_startScan() {
print("Scanning now");
_scanSubscription = flutterBlueBeacon
.scan(timeout: const Duration(seconds: 20))
.listen((beacon) {
print('localName: ${beacon.scanResult.advertisementData.localName}');
print(
'manufacturerData: ${beacon.scanResult.advertisementData.manufacturerData}');
print('serviceData: ${beacon.scanResult.advertisementData.serviceData}');
setState(() {
beacons[beacon.hash] = beacon;
});
}, onDone: _stopScan);
setState(() {
isScanning = true;
});
}
_stopScan() {
print("Scan stopped");
_scanSubscription?.cancel();
_scanSubscription = null;
setState(() {
isScanning = false;
});
}
_buildScanningButton() {
if (state != BluetoothState.on) {
return null;
}
if (isScanning) {
return new FloatingActionButton(
child: new Icon(Icons.stop),
onPressed: _stopScan,
backgroundColor: Colors.red,
);
} else {
return new FloatingActionButton(
child: new Icon(Icons.search), onPressed: _startScan);
}
}
_buildScanResultTiles() {
return beacons.values.map<Widget>((b) {
if (b is IBeacon) {
return IBeaconCard(iBeacon: b);
}
if (b is EddystoneUID) {
return EddystoneUIDCard(eddystoneUID: b);
}
if (b is EddystoneEID) {
return EddystoneEIDCard(eddystoneEID: b);
}
return Card();
}).toList();
}
_buildAlertTile() {
return new Container(
color: Colors.redAccent,
child: new ListTile(
title: new Text(
'Bluetooth adapter is ${state.toString().substring(15)}',
style: Theme.of(context).primaryTextTheme.subhead,
),
trailing: new Icon(
Icons.error,
color: Theme.of(context).primaryTextTheme.subhead.color,
),
),
);
}
_buildProgressBarTile() {
return new LinearProgressIndicator();
}
@override
Widget build(BuildContext context) {
var tiles = new List<Widget>();
if (state != BluetoothState.on) {
tiles.add(_buildAlertTile());
}
tiles.addAll(_buildScanResultTiles());
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
title: const Text('FlutterBlueBeacon Example'),
actions: <Widget>[
IconButton(icon: Icon(Icons.clear), onPressed: _clearAllBeacons)
],
),
floatingActionButton: _buildScanningButton(),
body: new Stack(
children: <Widget>[
(isScanning) ? _buildProgressBarTile() : new Container(),
new ListView(
children: tiles,
)
],
),
),
);
}
}