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
相关产品推荐
相关产品推荐

