Flutter电商APP登录报错:Null不是Iterable子类型(cart字段)
问题描述
我正在开发一款电商APP,登录页面的设计逻辑是:用户输入凭证并点击登录按钮后,展示用户的id、name、email、password、address、type、token、cart信息。APP能正常启动,但登录时弹出错误:
Exception has occurred. _TypeError (type 'Null' is not a subtype of type 'Iterable')
错误出现在处理cart字段的代码位置,注释掉cart相关代码后,报错消失,能正常读取登录凭证。相关代码如下:
import 'dart:convert'; class User { final String id; final String name; final String email; final String password; final String address; final String type; final String token; final List<dynamic> cart; User({ required this.id, required this.name, required this.email, required this.password, required this.address, required this.type, required this.token, required this.cart, }); Map<String, dynamic> toMap() { return { 'id': id, 'name': name, 'email': email, 'password': password, 'address': address, 'type': type, 'token': token, 'cart': cart, }; } factory User.fromMap(Map<String, dynamic> map) { return User( id: map['_id'] ?? '', name: map['name'] ?? '', email: map['email'] ?? '', password: map['password'] ?? '', address: map['address'] ?? '', type: map['type'] ?? '', token: map['token'] ?? '', cart: List<Map<String, dynamic>>.from( map['cart']?.map( (x) => Map<String, dynamic>.from(x), // 错误出现位置 ), ), ); } String toJson() => json.encode(toMap()); factory User.fromJson(String source) => User.fromMap(json.decode(source)); User copyWith({ String? id, String? name, String? email, String? password, String? address, String? type, String? token, List<dynamic>? cart, }) { return User( id: id ?? this.id, name: name ?? this.name, email: email ?? this.email, password: password ?? this.password, address: address ?? this.address, type: type ?? this.type, token: token ?? this.token, cart: cart ?? this.cart, ); } }
错误原因
问题出在User.fromMap工厂方法的cart字段处理逻辑:当接口返回的map['cart']为null时,map['cart']?.map()会返回null,而List.from()要求传入Iterable类型参数,无法接受null,因此触发类型转换错误。
解决方案
给map['cart']设置默认值,当它为null时传入空列表[],确保map()方法调用的对象始终是Iterable类型。修改cart字段的初始化代码即可:
import 'dart:convert'; class User { final String id; final String name; final String email; final String password; final String address; final String type; final String token; final List<dynamic> cart; User({ required this.id, required this.name, required this.email, required this.password, required this.address, required this.type, required this.token, required this.cart, }); Map<String, dynamic> toMap() { return { 'id': id, 'name': name, 'email': email, 'password': password, 'address': address, 'type': type, 'token': token, 'cart': cart, }; } factory User.fromMap(Map<String, dynamic> map) { return User( id: map['_id'] ?? '', name: map['name'] ?? '', email: map['email'] ?? '', password: map['password'] ?? '', address: map['address'] ?? '', type: map['type'] ?? '', token: map['token'] ?? '', // 修改此处:给cart设置默认空列表,避免null传入List.from cart: List<Map<String, dynamic>>.from( (map['cart'] ?? []).map( (x) => Map<String, dynamic>.from(x), ), ), ); } String toJson() => json.encode(toMap()); factory User.fromJson(String source) => User.fromMap(json.decode(source)); User copyWith({ String? id, String? name, String? email, String? password, String? address, String? type, String? token, List<dynamic>? cart, }) { return User( id: id ?? this.id, name: name ?? this.name, email: email ?? this.email, password: password ?? this.password, address: address ?? this.address, type: type ?? this.type, token: token ?? this.token, cart: cart ?? this.cart, ); } }
内容的提问来源于stack exchange,提问作者Marvin Ekokobe
相关产品推荐
相关产品推荐

