使用get_ip_address包获取IP时返回Future实例的问题求助
问题解决:获取IP时返回Instance of 'Future'
问题核心是你没有等待异步方法执行完成就直接使用返回的Future对象。getIp()是异步方法,返回的是Future<String>类型,必须通过await关键字等待它执行完毕,才能拿到实际的IP字符串。
修复步骤:
- 在按钮点击回调中,创建
User对象前调用getIp()并添加await,获取真实IP:
onPressed: isClick ? () async { isClick = false; final DateTime dateCreated = DateTime.now(); // 新增:等待异步方法完成,拿到实际IP字符串 final String ipAddress = await getIp(); setState(() { // 原代码此处仅写了dateCreated,未赋值给状态变量,建议修正为对应状态字段 // 示例:this._dateCreated = dateCreated; }); final user = User( name: _nameController.text, surname: _surnameController.text, email: _emailController.text, year: _selectedValue, dateCreated: DateFormat('dd/MM/y - HH:mm:ss').format(dateCreated), ipAddress: ipAddress); // 替换为真实IP hasInternet = await InternetConnectionChecker().hasConnection; await UserService.insert([user.toJson()]); if (hasInternet) { showToast(StringConstants.registerOkayText, duration: 2, gravity: Toast.bottom); } else { showToast(StringConstants.registerNotOkayText, duration: 5, gravity: Toast.bottom); } } : null,
- 优化
getIp()方法,确保返回正确的IP字符串:
当getIpAddress()返回JSON对象时,直接toString()会得到对象实例描述,需要提取具体IP字段(根据接口返回结构调整):
static Future<String> getIp() async { try { var ipAddressType = IpAddress(type: RequestType.json); dynamic ipData = await ipAddressType.getIpAddress(); // 假设返回的JSON包含'ip'字段,替换为实际字段名 return ipData['ip'] ?? '未知IP'; } on IpAddressException catch (exception) { return exception.message; } }
关键提示:
- 带
async的异步方法返回的Future是未完成的操作占位符,必须用await等待它完成,才能获取实际返回值。 - 直接将
Future对象赋值给字符串类型字段,就会输出Instance of 'Future'。
内容的提问来源于stack exchange,提问作者SonerB
相关产品推荐
相关产品推荐

