Flutter 低功耗蓝牙。无法在列表中添加扫描的设备
Flutter Bluetooth low Energy. Unable to add scanned devices in the list
我正在尝试创建所有已扫描设备的列表并显示在 ListTile 中。
这是我的代码
class HomePageState extends State<Home>{
BluetoothDevice device;
FlutterBlue flutterBlue = FlutterBlue.instance;
List<AdvertiseData> dta = [];
Future<List<AdvertiseData>> getAdvData() async{
var beaconName;
await flutterBlue.scan(timeout: Duration(seconds: 100)).listen((scanResult) {
device = scanResult.device;
beaconName = device.name;
if(beaconName != ""){
AdvertiseData d = AdvertiseData(beaconName, 1);
dta.add(d);
print(dta.length);
}
});
}
我正在一项一项地获取数据,列表每次都在更新。
I/flutter (12631): 1 //list has 1 device
I/flutter (12631): . //again list is initialized, contains 2 devices
I/flutter (12631): .
I/flutter (12631): .
I/flutter (12631): .
I/flutter (12631): .
I/flutter (12631): 142 //list is initialized,upto 142 devices
我只需要一个列表(或最后一个列表),这样我就可以在 ListTile 中显示数据。
只要你不停止扫描FlutterBlue.instance.stopScan()它就会继续更新列表。这是正常现象,只要知道如何处理就可以了。
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Blue'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool scanning = false;
final _scaffoldKey = GlobalKey<ScaffoldState>();
BluetoothDevice device;
FlutterBlue flutterBlue = FlutterBlue.instance;
List<ScanResult> dta = [];
startStop() {
if (scanning) {
flutterBlue.stopScan();
_scaffoldKey.currentState.showSnackBar(SnackBar(
content: Text("you have ${dta.length} devices"),
));
} else {
flutterBlue.startScan(timeout: Duration(seconds: 4));
}
setState(() {
scanning = !scanning;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(
title: Text(widget.title),
actions: <Widget>[
FlatButton(
child: Text(
scanning ? "Stop Scanning" : "Start Scanning",
style: TextStyle(color: Colors.white, fontSize: 14),
),
onPressed: () {
startStop();
},
)
],
),
body: StreamBuilder<List<ScanResult>>(
stream: FlutterBlue.instance.scanResults,
initialData: [],
builder: (c, snapshot) {
dta = snapshot.data;
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return Text(snapshot.data[index].device.name);
},
);
},
),
);
}
}
我正在尝试创建所有已扫描设备的列表并显示在 ListTile 中。
这是我的代码
class HomePageState extends State<Home>{
BluetoothDevice device;
FlutterBlue flutterBlue = FlutterBlue.instance;
List<AdvertiseData> dta = [];
Future<List<AdvertiseData>> getAdvData() async{
var beaconName;
await flutterBlue.scan(timeout: Duration(seconds: 100)).listen((scanResult) {
device = scanResult.device;
beaconName = device.name;
if(beaconName != ""){
AdvertiseData d = AdvertiseData(beaconName, 1);
dta.add(d);
print(dta.length);
}
});
}
我正在一项一项地获取数据,列表每次都在更新。
I/flutter (12631): 1 //list has 1 device
I/flutter (12631): . //again list is initialized, contains 2 devices
I/flutter (12631): .
I/flutter (12631): .
I/flutter (12631): .
I/flutter (12631): .
I/flutter (12631): 142 //list is initialized,upto 142 devices
我只需要一个列表(或最后一个列表),这样我就可以在 ListTile 中显示数据。
只要你不停止扫描FlutterBlue.instance.stopScan()它就会继续更新列表。这是正常现象,只要知道如何处理就可以了。
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Blue'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool scanning = false;
final _scaffoldKey = GlobalKey<ScaffoldState>();
BluetoothDevice device;
FlutterBlue flutterBlue = FlutterBlue.instance;
List<ScanResult> dta = [];
startStop() {
if (scanning) {
flutterBlue.stopScan();
_scaffoldKey.currentState.showSnackBar(SnackBar(
content: Text("you have ${dta.length} devices"),
));
} else {
flutterBlue.startScan(timeout: Duration(seconds: 4));
}
setState(() {
scanning = !scanning;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(
title: Text(widget.title),
actions: <Widget>[
FlatButton(
child: Text(
scanning ? "Stop Scanning" : "Start Scanning",
style: TextStyle(color: Colors.white, fontSize: 14),
),
onPressed: () {
startStop();
},
)
],
),
body: StreamBuilder<List<ScanResult>>(
stream: FlutterBlue.instance.scanResults,
initialData: [],
builder: (c, snapshot) {
dta = snapshot.data;
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return Text(snapshot.data[index].device.name);
},
);
},
),
);
}
}