Future,FutureBuilder
Future:代表网络请求的一个未来结果,包含成功和失败,以及其他的状态;
FutureBuilder:异步UI的编程,接受一个Future作为异步对象,然后根据Future的结果,来渲染UI。
class _MyHomePageState extends State<MyHomePage> {
String showResult = '';
Future<CommonModel> fetchPost() async {
var url = 'http://www.devio.org/io/flutter_app/json/test_common_model.json';
final response = await http.get(Uri.parse(url));
Utf8Decoder utf8decoder = Utf8Decoder(); // fix:中文乱码问题
final result = json.decode(utf8decoder.convert(response.bodyBytes));
return CommonModel.fromJson(result);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('网络请求测试|Future|FutureBuilder使用技巧'),
),
body: FutureBuilder<CommonModel>(
future: fetchPost(), // 指定future
builder: (BuildContext context, AsyncSnapshot<CommonModel> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return Center(child: Text('Input a url to start'));
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
case ConnectionState.active:
return Text('data');
case ConnectionState.done:
if (snapshot.hasError) {
return Text('${snapshot.error}',
style: TextStyle(color: Colors.red));
} else {
return Text('item:${snapshot.data.toString()}');
}
}
}),
);
}
}
/// 工厂模式,创建对象。
class CommonModel {
final String icon;
final String title;
final String url;
final String statusBarColor;
final bool hideAppBar;
CommonModel({
required this.icon,
required this.title,
required this.url,
required this.statusBarColor,
required this.hideAppBar,
});
factory CommonModel.fromJson(Map<String, dynamic> json) {
return CommonModel(
icon: json['icon'],
title: json['title'],
url: json['url'],
statusBarColor: json['statusBarColor'],
hideAppBar: json['hideAppBar'],
);
}
@override
String toString() {
return 'CommonModel{icon: $icon, title: $title, url: $url, statusBarColor: $statusBarColor, hideAppBar: $hideAppBar}';
}
}
more