Flutter项目导入rxdart与get库时Rx类名冲突如何解决?
Flutter Get与RxDart依赖冲突解决
问题场景
- 开发Flutter项目时,使用Get库实现状态管理与路由功能,同时引入RxDart库的
combineLatest2能力为音乐播放器提供时长处理支持,两个库同时导入时出现标识符冲突。
冲突报错
The name 'Rx' is defined in the libraries 'package:get/get_rx/src/rx_types/rx_types.dart' and 'package:rxdart/src/rx.dart (via package:rxdart/rxdart.dart)'
*报错中文说明:Rx这个类名在两个导入的库中都存在定义,分别是Get库内置的响应式类型实现、RxDart的核心响应式类实现,编译器无法自动识别代码中调用的Rx属于哪个库,因此抛出冲突。
解决方法
方法1:导入时用hide隐藏冲突类(推荐,代码侵入性最低)
绝大多数场景下,使用Get做状态管理时,我们调用的都是Get自带的Rx类来定义响应式变量,不需要用到RxDart中的Rx,只需要在导入RxDart时隐藏冲突的Rx类即可,combineLatest2等其他RxDart能力完全不受影响:
// Get库导入保持原有写法不用改 import 'package:get/get.dart'; // 导入RxDart时隐藏冲突的Rx类 import 'package:rxdart/rxdart.dart' hide Rx;
如果你的业务逻辑主要使用RxDart的Rx,不需要Get内置的Rx,反过来在导入Get时加hide Rx即可。
方法2:给库加as前缀(需要同时使用两个库的Rx时使用)
如果业务中确实需要同时用到两个库的Rx类,可以给其中一个库的导入加命名前缀,调用对应库的方法、类时带上前缀做区分:
// Get库正常导入 import 'package:get/get.dart'; // 给RxDart加专属前缀 import 'package:rxdart/rxdart.dart' as rxdart; // 调用Get的Rx不需要加前缀,原有响应式变量写法完全不用改 final musicDuration = Rx<Duration>(Duration.zero); // 调用RxDart的方法时带上前缀即可 final combineStream = rxdart.combineLatest2( positionStream, totalDurationStream, (position, total) => position / total ); // 如果需要用到RxDart的Rx类,直接写rxdart.Rx即可,不会产生冲突
提示:优先选择hide的方案,不需要修改项目中已经写好的Get响应式逻辑,改造成本最低。
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

