【问题标题】:Future returns empty list未来返回空列表
【发布时间】:2019-11-11 04:59:11
【问题描述】:

我是飞镖新手。我正在尝试查找连接到 wifi 网络的电视的 IP 地址。我首先找到所有局域网 IP 地址,然后对每个 IP 地址进行 TV 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 地址列表。

【问题讨论】:

    标签: dart stream future


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 2019-08-18
      • 2021-03-11
      • 2015-10-27
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多