Free fake API 为资料库,以 FutureBuilder + http 抓取
为Flutter 建立 Django 资料库
承上文章,此将 Flutter 去抓取本地服务器 Django 内的文章资料,并在模拟器内以 ListView 呈现。
Django:
开启 Django 资料库 runserver
python manage.py runserver 0.0.0.0:8000
Flutter:
<manifest ...">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</manifest>
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> {
// 输入资料网址 令 http 抓取资料
final String host = "http://172.20.10.4:8000/notes/"; // 将前改为自己的 IP 位置
Future getData() async {
final response = await http.get(Uri.parse(host));
Utf8Decoder utf8decoder = Utf8Decoder(); // 文章若有中文, 需以此修正乱码
var result = jsonDecode(utf8decoder.convert(response.bodyBytes));
print(result);
return result;
}
@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) {
List datas = (snapshot.data);
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...');
print(snapshot);
return Container();
}
},
),
);
}
}
开启模拟器测试,android 和 chrome 都可正常运行
注:
虽然是在同一台电脑内开服务器并用模拟器去抓资料,但android模拟器似乎就视为区网内的另一主机,所以服务器必须开启 ALLOWED_HOSTS,android模拟器在由此进入资料库。
起初观念不清在这兜圈子,给需要的人做个借镜!小白自学,欢迎评论指导!
<<: [Flutter ] 为Flutter 建立 Django 资料库
>>: 业务连续性委员会(Business Continuity Committee)
注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...
Cookie HTTP cookie 简称为Cookie,当使用者浏览网页时,web server会...
主体资料 (Body) 在传输资料时经常会使用到主体资料,比如说:POST、PUT、PATCH等操作...
在Day10的文章中有提到,Lists是指一个变数的值由多个值组成,这些值可以用底下的几种方式隔开 ...
记录画图轨迹 教学原文参考:记录画图轨迹 这篇文章会介绍,在 Scratch 3 里使用扩充功能的画...