当前位置: 首页 > 知识库问答 >
问题:

未处理的异常:类型“List”不是类型“Map”的子类型

暴博远
2023-03-14

更新:感谢@Rjulcaa回答我的地图现在是一个列表,但是列表没有显示在用户界面上。我转过来,我需要用FutureBuilder来处理未来,所以如果有人面临这个问题,记得在你的用户界面主体中添加一个FutureBuilder,并在构建器上返回你想要显示的小部件。

我正在制作一个todo列表教程,我正在尝试添加JSON上的编码功能,我的todoList将其保存在SharedReferences上,当我启动应用程序时,在屏幕上检索它

这是我的待办事项课

class Todo  {
Todo ({this.title,this.isDone = false});
String title;
bool isDone;


//Decode method to convert a Json String into a Dynamic object
Todo.fromJson(Map <String, dynamic> json)
: title = json ["title"],
  isDone  = json ["isDone"];
Map <String,dynamic> toJson() =>
{
       "title" : title,
       "isDone" : isDone
};
}

这是我的屏幕

class _TodoListScreenState extends State<TodoListScreen> {
List<Todo> todos = [];
@override
void initState() {
super.initState();
 _getTodoFromSharedPreferences();

}



//updates the state of the checkbox and reflects it on the UI
_toggleTodo(Todo todo, bool isChecked) {
setState(() {
  todo.isDone = isChecked;
});
}

_addTodo() async {
final todo = await showDialog<Todo>(
  context: context,
builder:(BuildContext context) { // <- Here you draw the Dialog
  return NewTodoDialog();
},
);
if (todo != null) {
  setState(() {
    todos.add(todo);
    _saveTodo(todos);
    print(todos.length);

    });
   }
   }

   _saveTodo(List<Todo> todo) async{
   final String newTodo = jsonEncode(todo);
   setSharedPreferences(newTodo);
   }



    _getTodoFromSharedPreferences () async {
    final prefs = await SharedPreferences.getInstance();
    final savedTodo = prefs.getString("savedTodo");
    if (savedTodo == null) {return null;} else {
    Map MapofTodos = jsonDecode(savedTodo);
  for (var i = 0; i < MapofTodos.length; ++i) {
    var o = MapofTodos[i];
    setState(() {
      Todo todo = Todo.fromJson(o);
      todos.add(todo);
    });


  }


}
}
 setSharedPreferences (String newTodo ) async{
 final prefs = await SharedPreferences.getInstance();
 await prefs.setString("savedTodo", newTodo );
 print(newTodo);
 }

 @override
  Widget build(BuildContext context) {
   return Scaffold(
            appBar: AppBar(backgroundColor:Colors.deepPurple[900] ,
               title: Text('Todo List')),
       body: TodoList(
         todos: todos,
         onTodoToggle: _toggleTodo,
       ),
       floatingActionButton: FloatingActionButton(
         backgroundColor: Colors.purpleAccent[700],
         child: Icon(Icons.add),
         onPressed: _addTodo,
       ),
   );
  }


  }

当我运行应用程序时,我得到了这个错误

E/flutter ( 7476): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] 
Unhandled Exception: type 'List<dynamic>' is not a subtype of type 
'Map<dynamic, dynamic>'
E/flutter ( 7476): #0      
_TodoListScreenState._getTodoFromSharedPreferences 
(package:flutter_todo/UI/todo_list_screen.dart:70:11)
E/flutter ( 7476): <asynchronous suspension>
E/flutter ( 7476): #1      _TodoListScreenState.initState 
(package:flutter_todo/UI/todo_list_screen.dart:29:6)
E/flutter ( 7476): #2      StatefulElement._firstBuild 
(package:flutter/src/widgets/framework.dart:3851:58)
E/flutter ( 7476): #3      ComponentElement.mount 
(package:flutter/src/widgets/framework.dart:3716:5)
E/flutter ( 7476): #4      Element.inflateWidget 
(package:flutter/src/widgets/framework.dart:2960:14)
E/flutter ( 7476): #5      Element.updateChild 
(package:flutter/src/widgets/framework.dart:2763:12)
E/flutter ( 7476): #6      SingleChildRenderObjectElement.mount 
(package:flutter/src/widgets/framework.dart:4881:14)
E/flutter ( 7476): #7      Element.inflateWidget 
(package:flutter/src/widgets/framework.dart:2960:14)
E/flutter ( 7476): #8      Element.updateChild 
(package:flutter/src/widgets/framework.dart:2763:12)
E/flutter ( 7476): #9      ComponentElement.performRebuild 
(package:flutter/src/widgets/framework.dart:3752:16)
E/flutter ( 7476): #10     Element.rebuild 
(package:flutter/src/widgets/framework.dart:3564:5)
E/flutter ( 7476): #11     ComponentElement._firstBuild 
(package:flutter/src/widgets/framework.dart:3721:5)
E/flutter ( 7476): #12     ComponentElement.mount 
(package:flutter/src/widgets/framework.dart:3716:5)
E/flutter ( 7476): #13     Element.inflateWidget 
(package:flutter/src/widgets/framework.dart:2960:14)
E/flutter ( 7476): #14     Element.updateChild 
(package:flutter/src/widgets/framework.dart:2763:12)
E/flutter ( 7476): #15     SingleChildRenderObjectElement.mount 
(package:flutter/src/widgets/framework.dart:4881:14)
E/flutter ( 7476): #16     Element.inflateWidget 
(package:flutter/src/widgets/framework.dart:2960:14)
E/flutter ( 7476): #17     Element.updateChild 
(package:flutter/src/widgets/framework.dart:2763:12)
E/flutter ( 7476): #18     SingleChildRenderObjectElement.mount 
(package:flutter/src/widgets/framework.dart:4881:14)
E/flutter ( 7476): #19     Element.inflateWidget 
(package:flutter/src/widgets/framework.dart:2960:14)
E/flutter ( 7476): #20     Element.updateChild 
(package:flutter/src/widgets/framework.dart:2763:12)
E/flutter ( 7476): #21     SingleChildRenderObjectElement.mount 
(package:flutter/src/widgets/framework.dart:4881:14)
E/flutter ( 7476): #22     Element.inflateWidget 
(package:flutter/src/widgets/framework.dart:2960:14)
E/flutter ( 7476): #23     Element.updateChild 
(package:flutter/src/widgets/framework.dart:2763:12)
E/flutter ( 7476): #24     SingleChildRenderObjectElement.mount 
(package:flutter/src/widgets/framework.dart:4881:14)
E/flutter ( 7476): #25     Element.inflateWidget 
(package:flutter/src/widgets/framework.dart:2960:14)
E/flutter ( 7476): #26     Element.updateChild 
(package:flutter/src/widgets/framework.dart:2763:12)
E/flutter ( 7476): #27     ComponentElement.performRebuild 
(package:flutter/src/widgets/framework.dart:3752:16)
E/flutter ( 7476): #28     Element.rebuild 
(package:flutter/src/widgets/framework.dart:3564:5)
E/flutter ( 7476): #29     ComponentElement._firstBuild 
(package:flutter/src/widgets/framework.dart:3721:5)
E/flutter ( 7476): #30     StatefulElement._firstBuild 
(package:flutter/src/widgets/framework.dart:3869:11)
E/flutter ( 7476): #31     ComponentElement.mount 
(package:flutter/src/widgets/framework.dart:3716:5)
E/flutter ( 7476): #32     Element.inflateWidget 
(package:flutter/src/widgets/framework.dart:2960:14)
E/flutter ( 7476): #33     Element.updateChild 
(package:flutter/src/widgets/framework.dart:2763:12)
E/flutter ( 7476): #34     ComponentElement.performRebuild 
(package:flutter/src/widgets/framework.dart:3752:16)
E/flutter ( 7476): #35     Element.rebuild 
(package:flutter/src/widgets/framework.dart:3564:5)
E/flutter ( 7476): #36     ComponentElement._firstBuild 
(package:flutter/src/widgets/framework.dart:3721:5)
E/flutter ( 7476): #37     ComponentElement.mount 
(package:flutter/src/widgets/framework.dart:3716:5)
E/flutter ( 7476): #38     Element.inflateWidget 
(package:flutter/src/widgets/framework.dart:2960:14)
E/flutter ( 7476): #39     Element.updateChild 
(package:flutter/src/widgets/framework.dart:2763:12)
E/flutter ( 7476): #40     ComponentElement.performRebuild 
(package:flutter/src/widgets/framework.dart:3752:16)
E/flutter ( 7476): #41     Element.rebuild 
(package:flutter/src/widgets/framework.dart:3564:5)
E/flutter ( 7476): #42     ComponentElement._firstBuild 
(package:flutter/src/widgets/framework.dart:3721:5)
E/flutter ( 7476): #43     StatefulElement._firstBuild 
(package:flutter/src/widgets/framework.dart:3869:11)
E/flutter ( 7476): #44     ComponentElement.mount 
(package:flutter/src/widgets/framework.dart:3716:5)
E/flutter ( 7476): #45     Ele

我试图将列表更改为地图,但没有成功

除了将小部件返回到屏幕之外,我已经成功了。请帮帮我

共有3个答案

羊舌承天
2023-03-14

在dart的应用程序开发过程中,我也遇到了同样的问题。json解码技术或可能是json转换的问题。我已经完成了创建方法的工作,将参数作为

getCardData(data[0]["cardContent"][0]["cardData"] as List),
  List<String> getCardData(data) {
    List<String> _cardInfo = [];
    for (int i = 0; i < data.length; i++) {
      _cardInfo.add(data[i] as String);
    }
    return _cardInfo;
  }
太叔志尚
2023-03-14

在这里,您试图迭代一个映射,这是不可能的,因为只有可能的Iterables对象被设置、列表和队列。

// Map MapofTodos = jsonDecode(savedTodo); 
//Try to debug it first first and see what type it's returning
print(jsonDecode(savedTodo).runtimeType);
麻茂材
2023-03-14

我以前遇到过这个问题,因为我想在共享首选项中保存一个数组对象。你可以试试这个。

//Save you array object as an array of Strings in Shared Preferences
 void _saveTodo(List<Todo> todo) async{
  SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
  sharedPreferences.setStringList("savedTodo", _mapTodoData(todo));
 }
}

将JSON转换为字符串数组

 List<String> _mapTodoData(List<dynamic> todos) async{
  try {
      var res = todos.map((v) => json.encode(v)).toList();
      return res;
    } catch (err) {
     // Just in case
      return [];
    }
 }
}

如果要获取和转换Todo对象列表中的数据

void loadData() async {

 SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
 final todoArray = _decodeTodoData(sharedPreferences.getStringList("savedTodo"))
 //This is your array :) -> todoArray    
}
List<Todo> _decodeTodoData(List<String> todos) {
    try {
      //Transforming List<String> to Json
      var result = todos.map((v) => json.decode(v)).toList();
      //Transforming the Json into Array<Todo>
      var todObjects = result.map((v) => Todo.fromJson(v)).toList();
      return todObjects;
    } catch (error) {
      return [];
    }
  }
}

这对我很有效,我真的很努力解决这个问题。

我希望这对你也有用。

 类似资料:
  • 我正在解码一个响应体,我得到了错误: 我在Udemy上学习颤振教程时,正在尝试使用API。教程说要使用https://javiercbk.github.io/json_to_dart/将JSON转换为Dart。我把JSON从https://www.openbrewerydb.org/并将其转换为Dart,但我遇到的问题是,当我尝试解码API时,我得到了未处理的错误异常:“List”类型不是“Map

  • 我对使用颤振和特定于平台的代码非常陌生,所以如果这是一个愚蠢的问题,请原谅我。我正在使用一个事件通道将数据从android端返回到Flatter。我正在返回一份清单 但是,当我试图添加它时,它给出了一个异常,“未处理的异常:类型'列表'不是类型'列表'的子类型 这是我要将贴图对象添加到的列表。 列表 这是我的添加代码。忽略print语句。 我尝试过像cast或from这样的方法,但它对我不起作用,

  • 我正在开发我的flutter应用程序的身份验证。请帮我解决这个问题。我无法识别返回这样一个错误的问题,声明未处理异常:类型列表不是类型字符串的子类型。 以下是登录屏幕的代码: 执行登录的上述代码部分: 错误

  • 我一直在我的颤振应用程序中使用sembast,我在我的类设备中包含我的类温度列表时遇到了问题。我已经包括以下两个类。 我得到未处理的异常:键入“ImmutableMap” 这种方法似乎被用于其他问题的解决方案,这些问题似乎与我的问题几乎相同,所以我不确定这里有什么问题,以及我尝试过的其他解决方案。

  • 我试图从一个API获取数据,但我一直得到上面的错误。下面是我的API响应的结构 下面是我如何获取数据的 知道我做错了什么吗?