[Flutter ] Free fake API 为资料库,以 FutureBuilder + http 抓取

程序版本: Flutter 2.2.1

使用JSONPlaceholder为 Free fake API 为资料库,将其导入官方 FutureBuilder class 范例作为测试,并改 ListView 为浏览大量资料。

  1. JSONPlaceholder 资料内容:
[
  {
    "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"
  },
......
  1. 先在 pubspec.yaml 内加入 http,在此使用版本为 0.13.3。
dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3

官网说明需在 AndroidManifest.xml file 加入下指令,但进到档案看时指令已存在。

<uses-permission android:name="android.permission.INTERNET" />
  1. 到 main.dart 修改 FutureBuilder class 范例入下:
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();
          }
        },
      ),
    );
  }
}

  1. 输出结果

注: 小白自学,欢迎评论指导!
参考资料:
https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
https://www.youtube.com/watch?v=UGAmBMld6xE


<<:  JavaScript - 做个录音录影功能ㄅ

>>:  [ JS个人笔记 ] 各种讨人厌的运算&转型案例—DAY2

[Day 15] Dialog 弹跳视窗

在需要提示,或是小分页显示时 通常我们会选择 Dialog 弹跳视窗 这边的使用背景是在D14时,如...

Data layer testing (3)

上一篇我们写好了 EtaResponseMapper 的 unit test。但 data laye...

[DAY 11] RDS 之 multi AZ 和 security 相关

multi AZ RDS 的 multi AZ 是为了做到 diaster recovery, 这与...

ITHOME IRONMAN体验 Day 30-完赛心得

完赛心得 第13届的铁人赛30天的挑战终於结束了,从参赛至完赛的准备期大约用了二个月。 初期花了大於...

Day 20 : 动态爬虫-利用webdriver达到自动登入

动态爬虫的做法主要是用在动态网页以及一些需要登入的网页,藉由自动加载指定网页,就可以获得需要加载才能...