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

Dart调用toList()抛出List<dynamic>转List<String>类型转换异常

问题根源

这个异常是Dart静态类型推断规则导致的,和传入参数本身是不是字符串类型无关。
你的构造函数入参没有显式声明类型,所有参数默认被识别为dynamic类型:哪怕你给hosts设置的默认值是字符串列表,由于参数本身类型是dynamic,后续调用map方法时泛型无法正确推断为String,最终toList()返回的是List<dynamic>类型,而mongo_dart的Db.pool方法要求入参必须是List<String>,类型不匹配就会抛出该异常。

解决方案

二选一即可修复问题:

  • 方案1:给构造函数的所有入参显式声明正确类型,从源头解决类型丢失问题,这是最推荐的写法。修正后的完整代码如下:
import 'package:mongo_dart/mongo_dart.dart';

class MongoDB {
  late Db db;

  MongoDB(
      // 显式声明每个参数的静态类型
      {List<String> hosts = const ['myserver1', 'myserver2', 'myserver3'],
      String port = '27017',
      String username = 'admin',
      String password = 'mypassword',
      String dbname = 'mydb',
      String authSource = 'admin'}) {
    db = Db.pool(
        hosts.map((elem) => "mongodb://$username:$password@$elem:$port/$dbname?authSource=$authSource").toList());
  }
}
  • 方案2:如果不想修改参数声明,就在调用map时显式指定泛型为String,强制返回结果为符合要求的List<String>,修改片段如下:
db = Db.pool(
  // 显式指定map的泛型参数为String
  hosts.map<String>((elem) => "mongodb://$username:$password@$elem:$port/$dbname?authSource=$authSource").toList()
);

内容的提问来源于stack exchange,提问作者cointreau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:48:15