我正在學習如何在 Dart/Flutter 中執行 http 請求。
我嘗試從https://jsonplaceholder.typicode.com/posts的簡單 api 執行 GET 請求
我得到了原始 json,但需要決議和映射它。
我的問題是我所遵循的檔案似乎已經過時,而且我與 LIST 一起使用的語法不再遵循空安全。
- 有沒有更好的方法在 Dart/Flutter 中執行 http 請求?
- 有沒有更好的方法來初始化我的
List<DataModel> model;
允許在不分解大量代碼的情況下實作空安全合規性?
main.dart
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'home_screen.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: HomeScreen(),
);
}
}
home_screen.dart
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'data_model.dart';
import 'dart:convert' as convert;
class HomeScreen extends StatefulWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
List<DataModel> model;
@override
void initState() {
getData();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Http Get Request'),
),
body: ListView.builder(itemBuilder: (BuildContext context, int index){
return const Card(
child: ExpansionTile(
title: Text(model[index].title),
children: [Text(model[index].body)],
),
);
},
itemCount: model.length,
),
);
}
Future<void> getData() async {
Uri url = Uri.https('jsonplaceholder.typicode.com', '/posts');
http.Response response = await http.get(url);
print(response.body);
List<dynamic> body = convert.jsonDecode(response.body);
model = body.map((dynamic item) => DataModel.fromJson(item)).toList();
setState(() {
});
}
}
資料模型.dart
class DataModel {
late int userId;
late int id;
late String title;
late String body;
DataModel({required this.userId, required this.id, required this.title, required this.body});
DataModel.fromJson(Map<String, dynamic> json) {
userId = json['userId'];
id = json['id'];
title = json['title'];
body = json['body'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userId'] = this.userId;
data['id'] = this.id;
data['title'] = this.title;
data['body'] = this.body;
return data;
}
}
uj5u.com熱心網友回復:
您應該能夠使用關鍵字late并使其成為final變數,因為initState()始終被呼叫,因此model不能為空。
您可以在此處了解有關后期最終變數的更多資訊
class _HomeScreenState extends State<HomeScreen> {
late final List<DataModel> model;
注意:通過建議您使用
final,我假設您不會model在其他任何地方重新分配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/330687.html
