Flutter自定义泛型Switch组件onChange回调类型不匹配怎么解决?
问题根因
- 泛型传递缺失:你定义的
CustomSwitch<T>带泛型参数,但对应的State类没有绑定泛型,声明的是class _CustomSwitchState extends State<CustomSwitch>,未指定父组件的泛型T,导致State内部访问widget属性时,所有泛型相关的类型都会被推导为dynamic,onChange的类型就变成了Function(dynamic)?,和外部传入的具体类型(比如Function(String)?、Function(int)?)不匹配,所以触发类型错误。 - 调用参数错误:你调用组件时拼写错了参数名,把
choice1写成了choise1,还重复声明了两次choise1,第二个应该是choice2,这个问题会导致编译不通过,需要同步修正。
修复步骤
- 给State类绑定泛型,保证父组件的泛型参数能正确传递到State内部
- 修正组件调用时的参数拼写错误
修复后的完整组件代码:
import 'package:flutter/material.dart'; import 'package:flutter_switch/flutter_switch.dart'; class CustomSwitch<T> extends StatefulWidget { final T choice1; final T choice2; final T? value; final Function(T)? onChange; const CustomSwitch({ required this.choice1, required this.choice2, this.value, this.onChange, }); // 修正createState返回的State类绑定泛型 @override _CustomSwitchState<T> createState() => _CustomSwitchState<T>(); } // 修正State类绑定父组件的泛型T class _CustomSwitchState<T> extends State<CustomSwitch<T>> { bool value = true; @override void initState() { super.initState(); value = widget.value == widget.choice1 || widget.value == null; } @override Widget build(BuildContext context) { return FlutterSwitch( value: value, activeText: widget.choice1.toString(), inactiveText: widget.choice2.toString(), onToggle: (bool value) { setState(() { this.value = value; if (widget.onChange != null) { // 此时widget.choice1、widget.choice2都是T类型,和onChange的参数类型匹配 widget.onChange!.call(value ? widget.choice1 : widget.choice2); } }); }, ); } }
修正后的组件调用代码:
CustomSwitch<String>( choice1: 'Active', choice2: 'Inactive', value: 'Active', onChange: (value) { print('value: $value'); } );
内容的提问来源于stack exchange,提问作者Ayad Salim
相关产品推荐
相关产品推荐

