【发布时间】:2020-10-10 18:21:47
【问题描述】:
当我阅读互联网上某个 url 上存在的文本文件的内容时,它就在函数内部工作。
这是我的功能
String x="";
Future<String> ip(String url)
async {
HttpClient client = new HttpClient();
var request = await client.postUrl(Uri.parse(url));
request.close().then((response) {
utf8.decoder.bind(response.cast<List<int>>()).listen((content) {
print(content);// output https://st03.sslstream.dlf.de/dlf/03/128/mp3/stream.mp3
setState(() {
x = content; // value null
});
});
});
}
所以当我打印这个文件的内容时
http://opml.radiotime.com/Tune.ashx?id=s120806
结果是
https://st03.sslstream.dlf.de/dlf/03/128/mp3/stream.mp3
但正如您在我的函数中看到的那样,我将内容的值赋予了 x 字段
setState(() {
x = content; // value null
});
所以当我在 initsstate 中调用函数然后打印 x 时,该值将为空!。
@override
void initState() {
ip("http://opml.radiotime.com/Tune.ashx?id=s120806"); //output https://st03.sslstream.dlf.de/dlf/03/128/mp3/stream.mp3
print(x); // output null
super.initState();
audioStart();
}
所以我需要为其他字段或属性提供响应的内容,或者我想让我的函数返回一个字符串而不是未来,这个字符串实际上是作为字符串的响应的内容,它不是空。
提前致谢
【问题讨论】:
-
您想对自定义
StatefulWidget中的x做什么?在build()方法构建的一些Widget中使用它? -
然后使用FutureBuilder
-
x 为空,因为当 print 语句打印 x 时,Future
ip甚至不会被执行,如果 x 不为空,你必须等待ip完成,熊请记住 init 不支持异步 -
获取字符串只需使用:
var response = await request.close(); return response.single.then(utf8.decode); -
使用http包时甚至更好:
Future<String> _initFuture() async { var resp = await http.get('http:/...'); return resp.body; }
标签: string flutter dart httpclient response