Flutter中MenuItem重名ambiguous_import报错排查与解决
问题根源
最初判断的冲突来源有误,命名冲突和本地cubit文件无关,两个报错的触发逻辑如下:
ambiguous_import导入歧义错误:MenuItem类同时存在于两个导入库中- 随
package:flutter/material.dart自动导入的Flutter SDK内置类,路径为package:flutter/src/widgets/platform_menu_bar.dart flutter_admin_scaffold依赖提供的侧边栏菜单组件,路径为package:flutter_admin_scaffold/src/menu_item.dart
- 随
invocation_of_non_function非函数调用错误:是上述歧义错误的衍生问题——编译器无法确定你要调用哪个同名类,就会将MenuItem识别为不可调用的模糊标识,而非可实例化的组件类,最终抛出非函数调用提示。
修复方案
二选一即可,根据自身业务场景选择:
方案1:隐藏SDK内置重名类(推荐,无需修改业务代码)
如果页面不需要使用Flutter内置的平台菜单栏MenuItem组件,直接在material导入语句中隐藏重名类即可,原有构建侧边栏的代码不需要做任何修改:
// 修改material导入行,隐藏内置MenuItem import 'package:flutter/material.dart' hide MenuItem; // 其余导入保持原有写法不变 import 'package:flutter_admin_scaffold/flutter_admin_scaffold.dart'; import 'cubit/cubit.dart'; import 'cubit/states.dart';
修改保存后重新编译,所有MenuItem调用会默认指向flutter_admin_scaffold提供的侧边栏组件,两个报错会直接消除。
方案2:给第三方依赖加前缀(需同时使用两个MenuItem时选择)
如果后续开发需要用到Flutter SDK内置的MenuItem类实现平台菜单功能,可以给flutter_admin_scaffold的导入添加命名前缀,调用时明确指定类来源:
// material导入保持不变 import 'package:flutter/material.dart'; // 给admin脚手架依赖添加前缀admin import 'package:flutter_admin_scaffold/flutter_admin_scaffold.dart' as admin; import 'cubit/cubit.dart'; import 'cubit/states.dart';
修改完成后,将AppLayout类中所有侧边栏用到的MenuItem组件调用,统一加上前缀即可,示例:
// 原侧边栏MenuItem写法 // MenuItem( // title: '首页', // route: '/dashboard', // icon: Icons.dashboard, // ) // 修改为带前缀的写法 admin.MenuItem( title: '首页', route: '/dashboard', icon: Icons.dashboard, )
此时SDK内置的MenuItem仍可通过MenuItem直接调用,两个同名类互不干扰。
内容的提问来源于stack exchange,提问作者Muhammad Arafat
相关产品推荐
相关产品推荐

