Flutter用泛型typedef封装Cupertino分段滑块时出现类型不匹配报错如何解决
问题原因
你的_SegmentedSliderState状态类没有和父组件的泛型绑定,声明时写的是State<SegmentedSlider>,没有携带泛型参数<T>,导致State内部获取的widget实例默认泛型为dynamic,itemBuilder的参数类型被擦除为dynamic,和你传入的指定SexualPreference参数的函数类型不匹配,因此抛出类型错误。
修复方案
只需修改状态类的继承声明,同时补充状态更新逻辑即可:
- 恢复你之前定义的泛型
typedef,这个定义本身没有问题 - 将
_SegmentedSliderState的父类State的泛型参数改为SegmentedSlider<T>,完成泛型绑定 - 补充
onValueChanged回调中的setState调用,保证内部状态更新触发重绘
修复后的完整组件代码如下:
typedef ItemValueWidgetBuilder<T> = Widget Function(BuildContext context, T key, bool active); class SegmentedSlider<T> extends StatefulWidget { final Color backgroundColor; final Color thumbColor; final ValueChanged<T?> onValueChanged; final T selectedValue; final List<T> values; final ItemValueWidgetBuilder<T> itemBuilder; const SegmentedSlider({ Key? key, this.thumbColor = Colors.grey, this.backgroundColor = Colors.white, required this.onValueChanged, required this.itemBuilder, required this.selectedValue, required this.values }) : super(key: key); @override _SegmentedSliderState<T> createState() => _SegmentedSliderState<T>(); } class _SegmentedSliderState<T> extends State<SegmentedSlider<T>> { // 核心修改:绑定泛型 late T activeValue; @override void initState() { super.initState(); activeValue = widget.selectedValue; } @override Widget build(BuildContext context) { final map = widget.values.map((e) { final childWidget = widget.itemBuilder(context, e, e == activeValue); return MapEntry<T, Widget>(e, childWidget); }); final Map<T, Widget> children = Map.fromEntries(map); return CupertinoSlidingSegmentedControl<T>( backgroundColor: widget.backgroundColor, thumbColor: widget.thumbColor, onValueChanged: (value) { setState(() { // 补充setState触发重绘 activeValue = value!; }); widget.onValueChanged(value); }, children: children, groupValue: activeValue, // 用内部activeValue保证滑动视觉同步 ); } }
修改后原来的组件调用代码无需任何调整,泛型即可正常生效。
内容的提问来源于stack exchange,提问作者CybeX
相关产品推荐
相关产品推荐

