首页 > 解决方案 > 我正在尝试借助颤振中的模型类从 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();
  }
}

标签: flutterdart

解决方案


您正在尝试setState通过widget.variable. 您没有显示所有小部件,但我猜它有一些属性,_recepientModel在小部件渲染期间可能为空。如果您想在 Widget 加载时获取数据,您应该_recepientModel在 StatefullWidget 和initState生命周期函数中添加状态变量,调用 api fech 然后执行 setState ,它将使用新数据重新渲染小部件。

更重要的是你应该做一些断言,_recepientModel(我只是猜测是一个列表)不是空的或者里面有一些项目。如果没有,那么它不会在里面渲染itemBuilder。为了方便起见,您可以_recepientModel在开始时将状态变量设置为空列表。


推荐阅读