Dart开发遇到User歧义导入及User不是函数报错如何解决
Dart 歧义导入与非函数调用报错关联分析及解决
关联原因
- 根源是两个库同时导出了重名的
User类型:你自定义的package:brew_crew/models/user.dart和Firebase官方的package:firebase_auth/firebase_auth.dart都定义了User类,Dart编译器无法自动区分你代码中User符号的指向,首先触发ambiguous_import歧义导入错误。 - 第二个
invocation_of_non_function是歧义导入未正确修复的衍生错误:当存在歧义时,如果你强行编译或未全量修改User的引用,编译器会错误匹配User符号的类型,无法识别到你预期的类构造函数,就会判定User不是可调用的函数/构造方法,抛出第二个报错。
解决方法
分两种场景选择对应的方案:
方案1:加导入前缀(适用于两个User类都需要使用的场景)
- 修改冲突库的导入语句,添加
as前缀区分,示例如下(给Firebase Auth库加前缀,不修改自定义模型的使用习惯):// 修改前 import 'package:firebase_auth/firebase_auth.dart'; // 修改后 import 'package:firebase_auth/firebase_auth.dart' as auth; - 全量替换代码中所有引用Firebase Auth的
User的位置,加上前缀:// 修改前 User? firebaseUser = FirebaseAuth.instance.currentUser; // 修改后 auth.User? firebaseUser = FirebaseAuth.instance.currentUser; - 自定义的
User类不需要额外修改,直接正常使用即可。
方案2:隐藏冲突名称(适用于只需要使用其中一个User类的场景)
如果你代码中全程不需要用到Firebase Auth的User类,只需要自定义的模型,直接在导入Firebase Auth时隐藏该名称即可:
import 'package:firebase_auth/firebase_auth.dart' hide User;
反之如果不需要用到自定义的User类,就修改自定义模型的导入语句:
import 'package:brew_crew/models/user.dart' hide User;
不需要修改其他业务代码中的User引用,编译器会自动匹配未被隐藏的类。
验证步骤
修复完成后执行flutter clean清除项目缓存,再重新编译,若仍有invocation_of_non_function报错,检查所有User的调用位置,确认前缀添加正确、构造函数拼写无误即可。
内容的提问来源于stack exchange,提问作者Samuel John-Ibro
相关产品推荐
相关产品推荐

