未来返回空列表

时间:2019-06-29 19:38:35

标签: dart stream future

我是飞镖新手。我正在尝试查找连接到wifi网络的电视的IP地址。为此,我先找到所有局域网IP地址,然后再对每个IP地址进行电视API调用。如果返回有效响应,则返回true。我的问题是lan ip地址列表列表总是空着。如果我对其进行硬编码以返回一些随机IP地址,则一切正常。我还可以看到找到的地址,因此它不应为空。

我尝试切换到静态列表,然后再切换到普通成员列表。得到相同的结果。

static getIpAdresses() async {
  String ip = await Wifi.ip;
  final String subnet = ip.substring(0, ip.lastIndexOf('.'));
  final int port = 80;
  List<String> lan = new List<String>() ;

  final stream = NetworkAnalyzer.discover(subnet, port);
  stream.listen((NetworkAddress addr) {
    if (addr.exists) { 
      print('Found device: ${addr.ip} ');
      lan.add(addr.ip.toString());
    }
  });
  return lan;
}

使用Network.getIpAdresses().then(( resp) {}时,我希望resp包含局域网IP地址的列表。

1 个答案:

答案 0 :(得分:1)

您的getIpAdresses函数在流上注册一个回调,但是在返回本地lan之前,它不等待从流中读取任何内容,该变量在时间仍然是一个空清单。

如果要等待完整读取流,则可以使用await for来迭代流元素:

static getIpAdresses() async {
  String ip = await Wifi.ip;
  final String subnet = ip.substring(0, ip.lastIndexOf('.'));
  final int port = 80;
  List<String> lan = new List<String>() ;

  final stream = NetworkAnalyzer.discover(subnet, port);
  await for (var addr in stream) {
    if (addr.exists) { 
      print('Found device: ${addr.ip} ');
      lan.add(addr.ip.toString());
    }
  }
  return lan;
}

有关使用Dart流和await for的更多信息,请参见Asynchronous programming: streams