включение содержимого URL-адреса внутри виджета

#flutter #http #dart #httpclient #response

#flutter #http #dart #httpclient #ответ

Вопрос:

я хочу получить содержимое проанализированного значения json, которое вызывает URL

 import 'dart:async';
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
Future<List<Photo>> fetchPhotos(http.Client client) async {
  final response =
  await client.get('https://pastebin.com/raw/RfNvKVPp');
  return compute(parsePhotos, response.body);
}
List<Photo> parsePhotos(String responseBody) {
  final parsed = jsonDecode(responseBody)['body'][0]['children'] as List;
  return parsed.map<Photo>((json) => Photo.fromJson(json)).toList();
}
class Photo {
  final String URL;
  final String text;
  Photo({this.URL, this.text});
  factory Photo.fromJson(Map<String, dynamic> json) {
    return Photo(
      text: json['text'] as String,
      URL: json['URL'] as String,
    );
  }
}
void main() {

  runApp(MyApp());}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final appTitle = 'Isolate Demo';
    return MaterialApp(
      title: appTitle,
      home: MyHomePage(title: appTitle),
    );
  }
}
class MyHomePage extends StatefulWidget {
  final String title;
  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  void initState() {

    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: FutureBuilder<List<Photo>>(
        future: fetchPhotos(http.Client()),
        builder: (context, snapshot) {
          if (snapshot.hasError) print(snapshot.error);
          return snapshot.hasData
              ? PhotosList(photos: snapshot.data)
              : Center(child: CircularProgressIndicator());
        },
      ),
    );
  }
}
class PhotosList extends StatelessWidget {
  final List<Photo> photos;
  PhotosList({Key key, this.photos}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: photos.length,
      itemBuilder: (context, index) {
        return ListTile(
          title:Text(photos[index].URL, style: TextStyle(color: Colors.blueGrey, fontSize: 14),),
          subtitle:Text(photos[index].text, style: TextStyle(color: Colors.red, fontSize: 14),),
          leading: Icon(Icons.threed_rotation, color: Colors.pink,),
        );
      },
    );
  }
}
  

итак, как вы можете видеть, я мог получить URL-адрес из json, и я его использовал

 title:Text(photos[index].URL, style: TextStyle(color: Colors.blueGrey, fontSize: 14),),
  

но я хочу получить содержимое файла, которое существует внутри

 photos[index].URL
  

мы можем сделать это, прочитав ответный запрос http или получив содержимое напрямую с помощью httpclient .

http

  Future<String> _initFuture(String url) async {
var resp = await http.get(url);
return resp.body;
  }
  

httpclient

   Future<String> ip(String url)
  async {
    HttpClient client = new HttpClient();
    var request = await client.postUrl(Uri.parse(url));
    var response = await request.close(); 
    return response.single.then(utf8.decode);
  }
  

итак, проблема в том, что я не знал, как вызвать функцию ip или _initFuture в моем коде

чтобы получить содержимое URL-адреса

 title:Text(here i need the response or the content of the url not the url itself , style: TextStyle(color: Colors.blueGrey, fontSize: 14),),
  

вместо URL-адреса

 title:Text(widget.photos[index].URL , style: TextStyle(color: Colors.blueGrey, fontSize: 14),),
  

заранее спасибо

Комментарии:

1. вместо Text этого я бы создал другой StatefulWidget , который возвращает другой FutureBuilder из своего build метода — например class Photo extends StatefulWidget (...

2. oooops у вас уже есть Photo класс, поэтому назовите его по-другому, также, чтобы минимизировать сетевой трафик, кэшируйте свои Future s в некоторых Map (вы можете использовать MapCache , например)

3. конечно, ваше приветствие, кстати, вы кэшировали Future s?