flutter - 我正在尝试借助颤振中的模型类从 api 加载数据
问题描述
我正在尝试从 api 获取数据并在加载数据时与模型类绑定,列表即时获取 null 对象。我已经尝试了很多解决方案,但没有一种方法可以奏效。我从 github 尝试过的代码。
class _ChooseRecipientPageState extends State<ChooseRecipient1> {
void recepinets(){
receipientModel().then((dynamic res){
setState(() {
widget._recepientModel=res;
});
});
}
//Here i am trying to access data from model class which is load in list type of variable
Container(
child: new Flexible(
child: ListView.builder(
itemCount:widget._recepientModel.length,
itemBuilder: (context,index) {
return GestureDetector(
onTap: () => {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PostYourStatus(
),
),
),
},
//这里我试图从模型类中访问数据,该模型类加载到列表类型的变量中,并且在这个变量的帮助下,我将访问它的属性。
Container(
width: 230,
child: Padding(
padding: const EdgeInsets.all(10),
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Text(
'${widget._recepientModel[index].successData[index].firstName}',
style: TextStyle(
fontFamily: 'Poppins',
fontSize: 17),
),
],
),
// 这是我的模型类
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
class RecepientModel {
String status;
List<SuccessData> successData;
int dataCount;
RecepientModel({this.status, this.successData, this.dataCount});
RecepientModel.fromJson(Map<String, dynamic> json) {
status = json['status'];
if (json['success_data'] != null) {
successData = new List<SuccessData>();
json['success_data'].forEach((v) {
successData.add(new SuccessData.fromJson(v));
});
}
dataCount = json['data_count'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
if (this.successData != null) {
data['success_data'] = this.successData.map((v) => v.toJson()).toList();
}
data['data_count'] = this.dataCount;
return data;
}
}
class SuccessData {
int id;
String firstName;
String lastName;
String email;
String phoneNumber;
String profileImage;
String giftedTagLine;
SuccessData(
{this.id,
this.firstName,
this.lastName,
this.email,
this.phoneNumber,
this.profileImage,
this.giftedTagLine});
SuccessData.fromJson(Map<String, dynamic> json) {
id = json['id'];
firstName = json['first_name'];
lastName = json['last_name'];
email = json['email'];
phoneNumber = json['phone_number'];
profileImage = json['profile_image'];
giftedTagLine = json['gifted_tag_line'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['first_name'] = this.firstName;
data['last_name'] = this.lastName;
data['email'] = this.email;
data['phone_number'] = this.phoneNumber;
data['profile_image'] = this.profileImage;
data['gifted_tag_line'] = this.giftedTagLine;
return data;
}
}
Future<List<SuccessData>> receipientModel() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var accessToken =prefs.getString("token");
var id =prefs.getString("id");
var url = 'https://bruyou.project-demo.info/api/V1/customer/${id}/chooseRecipient';
//encode Map to JSON
var response = await http.get(url,headers: {"Content-Type": "application/json","Authorization":accessToken},);
final responseJson = json.decode(response.body);
Iterable list=responseJson['successData'];
if(responseJson['status']==200){
return list.map((mod) => SuccessData.fromJson(mod)).toList();
}
}
解决方案
您正在尝试setState
通过widget.variable
. 您没有显示所有小部件,但我猜它有一些属性,_recepientModel
在小部件渲染期间可能为空。如果您想在 Widget 加载时获取数据,您应该_recepientModel
在 StatefullWidget 和initState
生命周期函数中添加状态变量,调用 api fech 然后执行 setState ,它将使用新数据重新渲染小部件。
更重要的是你应该做一些断言,_recepientModel(我只是猜测是一个列表)不是空的或者里面有一些项目。如果没有,那么它不会在里面渲染itemBuilder
。为了方便起见,您可以_recepientModel
在开始时将状态变量设置为空列表。
推荐阅读
- java - 所需的最低隔离级别是多少?
- apache - 无 IP 和 XAMPP Apache 服务器的 SSL
- r - 存储观星者回归输出
- html - 使用 firebase.database.on('child_added',snap=>{}) 时如何运行 DataTable(),它会在新子节点上附加一行
- javascript - 切换到响应式移动设备时如何并排对齐四个div
- python - 如何在 Kivy python 代码中显示表格
- automation - 如何在宏创建器的默认循环之外定义变量
- python - Altair:在具有连续刻度的散点图上进行回归
- firebase - Flutter - FirebaseMessaging.onMessageOpenedApp.listen 未触发
- java - 代表不同类型的Java方法参数