получить содержимое текстового файла в Интернете, flutter

#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 , если вы хотите использовать ответ в виджете