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);
            },
          );
        },
      ),
    );
  }
}