#string #flutter #dart #httpclient #response
#строка #flutter #dart #httpclient #ответная реакция #ответ
Вопрос:
когда я читаю содержимое текстового файла, существующего по 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 , значение будет равно null !.
@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();
}
итак, мне нужно предоставить другому полю или свойству содержимое ответа, или я хочу, чтобы моя функция возвращала строку, а не будущее, и эта строка будет действительно содержимым ответа в виде строки, и это не null .
заранее спасибо
Комментарии:
1. что вы хотите сделать с этим
x
внутри вашего обычаяStatefulWidget
? чтобы использовать его в какомWidget
-то построенном поbuild()
методу?2. тогда используйте FutureBuilder
3. x равно нулю, потому что, пока оператор print печатает x, Future
ip
will даже не будет выполнен, чтобы x не было null, вы должны дождатьсяip
завершения, имейте в виду, что init не поддерживает асинхронность4. и чтобы получить строку, просто используйте:
var response = await request.close(); return response.single.then(utf8.decode);
5. или даже лучше при использовании http -пакета:
Future<String> _initFuture() async { var resp = await http.get('http:/...'); return resp.body; }
Ответ №1:
попробуйте это,
@override
void initState() {
initAsyncState();
}
void initAsyncState() async {
await ip("http://opml.radiotime.com/Tune.ashx?id=s120806"); //output https://st03.sslstream.dlf.de/dlf/03/128/mp3/stream.mp3
print(x); // output will not be null
}
используйте a FutureBuilder
, если вы хотите использовать ответ в виджете