Flutter 类型';列表<;动态>';不是类型为';列表<;待办事项>';

Flutter 类型';列表<;动态>';不是类型为';列表<;待办事项>';,flutter,dart,dio,getx,Flutter,Dart,Dio,Getx,我使用dio和getx来获取todo数据列表,但我看到了以下消息 类型“List”不是类型“List”的子类型 当我走到这条线的时候 列表响应代码=rsp.data['data'] 这一行发生了什么以及如何修复,谢谢 服务类在转换为列表时更新,但仍然存在相同问题 1-控制器的第一类 2-服务类的第二个 class TodoListController extends GetxController { //var lstTask = List<dynamic>.empty(grow

我使用dio和getx来获取todo数据列表,但我看到了以下消息

类型“List”不是类型“List”的子类型

当我走到这条线的时候

列表响应代码=rsp.data['data']

这一行发生了什么以及如何修复,谢谢

服务类在转换为列表时更新,但仍然存在相同问题

1-控制器的第一类 2-服务类的第二个

class TodoListController extends GetxController {
  //var lstTask = List<dynamic>.empty(growable: true).obs;
  var items = List<Todo>.empty(growable: true).obs;

  var page = 1.obs;
  var totalRows = 10.obs;
  var isDataProcessing = false.obs;
  var isMoreDataAvailable = true.obs;
  var isSearching = false.obs;
  var isLoading = false.obs;
  var isCompleted = true.obs;

  var errorMsg = ''.obs ;
  var http = new HttpUtils();

  // For Pagination
  ScrollController scrollController = ScrollController();

  @override
  onInit() {
    super.onInit();
    // Fetch Data
    getTodo(page);

  }

  // Fetch Data
   getTodo(var page) {
    try {
      isMoreDataAvailable(false);
      isDataProcessing(true);
      AppServices().getTodo(page).then((resp) {
        isDataProcessing(false);
        resp.forEach(( dynamic json) {
          items.add(Todo.fromJson(json));
        });
        print(resp);
        //items.addAll(resp);
      }, onError: (err) {
        isDataProcessing(false);
        AppServices().showSnackBar("Error", err.toString(), Colors.red);
      });
    } catch (exception) {
      isDataProcessing(false);
      AppServices().showSnackBar("Exception", exception.toString(), Colors.red);
    }
  }

  // Get More data
   getMoreTodo(var page) {
    try {
        AppServices().getTodo(page).then((resp) {
        if (resp.length > 0) {
          isMoreDataAvailable(true);
        } else {
          isMoreDataAvailable(false);
          AppServices().showSnackBar("Message", "No more items", Colors.lightBlueAccent);
        }
        items.addAll(resp);
      }, onError: (err) {
        isMoreDataAvailable(false);
        AppServices().showSnackBar("Error", err.toString(), Colors.red);
      });
    } catch (exception) {
      isMoreDataAvailable(false);
      AppServices().showSnackBar("Exception", exception.toString(), Colors.red);
    }
  }
}

   
类TodoListController扩展了GetxController{
//var lstTask=List.empty(可增长:true).obs;
var items=List.empty(可增长:true).obs;
var-page=1.obs;
var totalRows=10.obs;
var isDataProcessing=false.obs;
var isMoreDataAvailable=true.obs;
var isSearching=false.obs;
var isLoading=false.obs;
var isCompleted=true.obs;
var errorMsg=''.obs;
var http=newhttputils();
//分页
ScrollController ScrollController=ScrollController();
@凌驾
onInit(){
super.onInit();
//获取数据
盖托多(第页);
}
//获取数据
getTodo(变量页){
试一试{
isMoreDataAvailable(假);
isDataProcessing(true);
AppServices().getTodo(第页)。然后((resp){
isDataProcessing(假);
resp.forEach((动态json){
items.add(Todo.fromJson(json));
});
印刷(resp);
//项目。添加所有(resp);
},onError:(错误){
isDataProcessing(假);
AppServices().showSnackBar(“Error”,err.toString(),Colors.red);
});
}捕获(例外){
isDataProcessing(假);
AppServices().showSnackBar(“Exception”,Exception.toString(),Colors.red);
}
}
//获取更多数据
getMoreTodo(变量页){
试一试{
AppServices().getTodo(第页)。然后((resp){
如果(分别长度>0){
isMoreDataAvailable(true);
}否则{
isMoreDataAvailable(假);
AppServices();
}
项目。添加所有(resp);
},onError:(错误){
isMoreDataAvailable(假);
AppServices().showSnackBar(“Error”,err.toString(),Colors.red);
});
}捕获(例外){
isMoreDataAvailable(假);
AppServices().showSnackBar(“Exception”,Exception.toString(),Colors.red);
}
}
}
类AppServices扩展了GetConnect{ var http=newhttputils()

//获取数据
未来getTodo(varid)异步{
试一试{
Response rsp=wait http.get(AppUrl.get_todo,{'current_page':id});
打印(rsp.data['data']);
如果(rsp.数据[“响应状态”!='400'){
List responseBode=rsp.data['data'].map((todo)=>todo.fromJson(todo)).toList();
返回响应码;
}否则{
返回rsp.数据[“响应消息”];
}
}捕获(例外)
{
返回Future.error(exception.toString());
}
}
}

问题在于
动态
列表无法自动转换为
待办事项的列表。
可以按如下方式转换列表:

 List<Todo> responseBode = rsp.data['data'].map ((todo) => Todo.fromJson(todo)).toList();
class Todo {
     //Your todo class
     String name;
      Todo.fromJson (data) {
          // conversion here
          name = data["name"] ?? null;
    }
}

问题是
动态
列表无法自动转换为
待办事项
列表。 可以按如下方式转换列表:

 List<Todo> responseBode = rsp.data['data'].map ((todo) => Todo.fromJson(todo)).toList();
class Todo {
     //Your todo class
     String name;
      Todo.fromJson (data) {
          // conversion here
          name = data["name"] ?? null;
    }
}

这可以通过简单的类型转换来修复。我注意到您正在将
Dio
GetConnect
一起使用。这本身没什么问题,但我无法想象你为什么需要两者

既然您已经进入了GetX世界,下面就是使用GetConnect的情况。这就是我可以测试的方式,因为我不确定
HttpUtils
来自哪里

class AppServices extends GetConnect {
  // var http = new HttpUtils();

  // Fetch Data
  Future<List<Todo>> getTodo(var id) async {
    try {
      Response rsp = await httpClient.get(AppUrl.get_todo, {'current_page': id});
      print(rsp.body['data']);
      if (rsp.statusCode != 400) {
        List<Todo> responseBode = rsp.body['data'] as List<Todo>; // casting type here
        return responseBode;
      } else {
        return rsp.body["response_message"];
      }
    } catch (exception) {
      return Future.error(exception.toString());
    }
  }
}
GetConnect
为您处理json解码,因此在使用该功能时,您无需再手动执行任何json工作

编辑:要回答有关在
GetConnect
中向标题添加身份验证的评论中的问题,请执行以下操作:

你可以这样做

final url = 'http://...'
 void _setUrl() {
    httpClient.baseUrl = url;
    httpClient.addRequestModifier((request) {
      request.headers['apikey'] = yourApiKey;
      return request;
    });
  }
之后你就可以打电话了

final response = await httpClient.get(url);
您的密钥将位于url中


然后它返回一个常规映射,您就可以开始了。

这可以通过简单的类型转换来解决。我注意到您正在将
Dio
GetConnect
一起使用。这本身没什么问题,但我无法想象你为什么需要两者

既然您已经进入了GetX世界,下面就是使用GetConnect的情况。这就是我可以测试的方式,因为我不确定
HttpUtils
来自哪里

class AppServices extends GetConnect {
  // var http = new HttpUtils();

  // Fetch Data
  Future<List<Todo>> getTodo(var id) async {
    try {
      Response rsp = await httpClient.get(AppUrl.get_todo, {'current_page': id});
      print(rsp.body['data']);
      if (rsp.statusCode != 400) {
        List<Todo> responseBode = rsp.body['data'] as List<Todo>; // casting type here
        return responseBode;
      } else {
        return rsp.body["response_message"];
      }
    } catch (exception) {
      return Future.error(exception.toString());
    }
  }
}
GetConnect
为您处理json解码,因此在使用该功能时,您无需再手动执行任何json工作

编辑:要回答有关在
GetConnect
中向标题添加身份验证的评论中的问题,请执行以下操作:

你可以这样做

final url = 'http://...'
 void _setUrl() {
    httpClient.baseUrl = url;
    httpClient.addRequestModifier((request) {
      request.headers['apikey'] = yourApiKey;
      return request;
    });
  }
之后你就可以打电话了

final response = await httpClient.get(url);
您的密钥将位于url中


然后它返回一个常规映射,您就可以开始了。

您只需使用GetConnect而不使用Dio即可

您的应用程序服务如下所示:

Future<List<Todo>> getTodo(var id) async {
  final response =  await http.get(AppUrl.get_todo, query:{'current_page': id}, decoder: Todo.listFromJson);
  if(response.hasError){
    return Future.error(response.statusText);
   }
  return response.body;
}
Future getTodo(varid)异步{
final response=wait http.get(AppUrl.get_todo,查询:{'current_page':id},解码器:todo.listFromJson);
if(response.hasError){
返回Future.error(response.statusText);
}
返回响应.body;
}
您的模型将如下所示:

class Todo {
 String name;
  Todo.fromJson (data) {
      name = data["name"] ?? null;
    }

 static List<Todo> listFromJson(dynamic str) => List<Todo>.from((str as List<dynamic>).map((x) => Todo.fromJson(x)));
}
类待办事项{
字符串名;
Todo.fromJson(数据){
名称=数据[“名称”]??空;
}
静态列表listFromJson(动态str)=>List.from((str作为List.map)(x)=>Todo.fromJson(x));
}
现在它将直接返回Todo对象的列表

用法可能如下(在控制器中):

final todoList=[].obs;
onInit()异步{
...
等待getTodos();
}
Future getTodos()异步{
试一试{
最终TODO=等待appServices.getTodo(1);
todoList.assignAll(todos);
}捕获(e){
//在这里处理错误。例如,显示snackbar
}

您可以在不使用Dio的情况下使用GetConnect

您的应用程序服务如下所示:

Future<List<Todo>> getTodo(var id) async {
  final response =  await http.get(AppUrl.get_todo, query:{'current_page': id}, decoder: Todo.listFromJson);
  if(response.hasError){
    return Future.error(response.statusText);
   }
  return response.body;
}
Future getTodo(变量id)asyn