You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:55:13