程序版本: Flutter 2.2.1
使用JSONPlaceholder为 Free fake API 为资料库,将其导入官方 FutureBuilder class 范例作为测试,并改 ListView 为浏览大量资料。
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
},
......
dependencies:
flutter:
sdk: flutter
http: ^0.13.3
官网说明需在 AndroidManifest.xml file 加入下指令,但进到档案看时指令已存在。
<uses-permission android:name="android.permission.INTERNET" />
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http; // 导入 http.get 抓资料
import 'dart:convert'; // 导入 jsonDecode 解压资料
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: _title,
home: MyStatefulWidget(),
);
}
}
class MyStatefulWidget extends StatefulWidget {
const MyStatefulWidget({Key? key}) : super(key: key);
@override
State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
// 原例: 延迟 2 秒後传入 String 'Data Loaded'
final Future<String> _calculation = Future<String>.delayed(
const Duration(seconds: 2),
() => 'Data Loaded',
);
// 输入资料网址 令 http 抓取资料
final String host = 'https://jsonplaceholder.typicode.com/posts';
getData() {
return http.get(Uri.parse(host)); // http 0.13 後不能直接输入 string
}
@override
Widget build(BuildContext context) {
// 改为 Scaffold 输出
return Scaffold(
appBar: AppBar(
title: Text('FutureBuilder'),
),
body: FutureBuilder(
future: getData(), // 执行 http
builder: (BuildContext context, AsyncSnapshot snapshot) {
// snapshot 抓资料,若优资料则:
if (snapshot.hasData) {
// jsonDecode 解压
List datas = jsonDecode(snapshot.data.body);
return ListView.builder(
itemCount: datas.length,
itemBuilder: (context, idx) {
var data = datas[idx];
return ListTile(
title: Text(data['title']),
subtitle: Text(data['body']),
);
});
} else if (snapshot.hasError) {
print('Error: ${snapshot.error}');
return Container(); // 失败回传空资料
} else {
print('Awaiting result...');
return Container();
}
},
),
);
}
}
注: 小白自学,欢迎评论指导!
参考资料:
https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
https://www.youtube.com/watch?v=UGAmBMld6xE
>>: [ JS个人笔记 ] 各种讨人厌的运算&转型案例—DAY2
在需要提示,或是小分页显示时 通常我们会选择 Dialog 弹跳视窗 这边的使用背景是在D14时,如...
上一篇我们写好了 EtaResponseMapper 的 unit test。但 data laye...
multi AZ RDS 的 multi AZ 是为了做到 diaster recovery, 这与...
完赛心得 第13届的铁人赛30天的挑战终於结束了,从参赛至完赛的准备期大约用了二个月。 初期花了大於...
动态爬虫的做法主要是用在动态网页以及一些需要登入的网页,藉由自动加载指定网页,就可以获得需要加载才能...