#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?