Flutter/Dart Dio报错:dynamic无法赋值给Map<String,dynamic>求助
解决Dio BaseModel实现中的两个错误
错误1:参数类型'dynamic'无法赋值给参数类型'Map<String, dynamic>'
原因
在dioGet方法中,当接口返回List类型数据时,遍历出的元素e是dynamic类型,但BaseModel.fromJson要求传入Map<String, dynamic>类型参数,编译器无法确认e的具体类型,因此抛出类型不匹配错误。
解决方法
遍历列表时先过滤或断言元素为Map<String, dynamic>,保证类型安全:
if (responseBody is List) { return responseBody .whereType<Map<String, dynamic>>() // 过滤非Map类型元素 .map((e) => model.fromJson(e)) .toList(); }
如果能确认接口返回的列表元素一定是Map,也可以直接用类型断言:
return responseBody.map((e) => model.fromJson(e as Map<String, dynamic>)).toList();
错误2:存在死代码,建议移除或修复前置代码使其可达
原因
在switch的HttpStatus.ok分支中,最后一行是return responseBody;,执行到这里会直接跳出方法,后续的break;永远不会被执行,因此被标记为死代码。
解决方法
直接删除该分支末尾的break;语句即可。
额外修复:单例初始化问题
你的NetworkManager单例实现存在逻辑漏洞,init()空构造函数导致_instance中的_dio未初始化,运行时会抛出LateInitializationError,需修正单例初始化逻辑:
将原代码中的:
NetworkManager.init(); static final NetworkManager _instance = NetworkManager.init();
改为:
static final NetworkManager _instance = NetworkManager._init();
修正后的完整代码
NetworkManager.dart
import 'dart:io'; import 'package:dio/dio.dart'; import 'package:mintsisv1/core/base/model/base_model.dart'; import 'package:mintsisv1/core/constants/service.dart'; class NetworkManager { NetworkManager._init() { final baseOptions = BaseOptions( baseUrl: AppService.baseUrl, headers: {'Authorization': 'Bearer ${AppService.apiToken}'}, ); _dio = Dio(baseOptions); } static final NetworkManager _instance = NetworkManager._init(); static NetworkManager get instance { return _instance; } late Dio _dio; // 给Future添加泛型,明确返回类型 Future<T?> dioGet<T extends BaseModel<T>>(String path, T model) async { final response = await _dio.get(path); switch (response.statusCode) { case HttpStatus.ok: final responseBody = response.data; if (responseBody is List) { return responseBody .whereType<Map<String, dynamic>>() .map((e) => model.fromJson(e)) .toList() as T?; } else if (responseBody is Map<String, dynamic>) { return model.fromJson(responseBody); } return null; default: throw Exception('Network Error'); } } }
BaseModel.dart
abstract class BaseModel<T> { Map<String, dynamic> toJson(); T fromJson(Map<String, dynamic> json); }
内容的提问来源于stack exchange,提问作者MertYavuz
相关产品推荐
相关产品推荐

