FlutterSlider的onDragging回调出现Missing parameter type报错如何解决?
报错根本原因
Very Good Cli(VGC)创建的项目默认开启了最严格的 Dart 静态分析规则,其中就包含implicit-dynamic: false配置,该规则要求所有变量、参数必须显式声明类型,不允许隐式的dynamic类型。
而another_xlider库的onDragging回调本身的类型定义就是Function(int handlerIndex, dynamic lowerValue, dynamic upperValue),后两个参数设计上就是dynamic类型(同时支持int和double两种返回值),你强行把参数类型声明为int,和库定义的函数签名不匹配,自然会报类型不兼容错误。你看到的签名里的星号是IDE的标记符号,不是Dart语法的一部分,仅用来标识函数定义的参数占位符,和yield的星号没有任何关系。
官方示例能正常运行是因为普通Flutter项目默认没有开启如此严格的分析规则,允许隐式dynamic存在,所以不会触发报错。
正确解决方案
不需要修改analysis_options的规则,也不需要替换组件,按照以下方式修改代码即可解决问题:
- 给后两个参数显式声明为
dynamic类型,既符合库的函数签名要求,也满足静态分析的显式类型要求:
values: const [1000, 4000], rangeSlider: true, max: 10000, min: 500, onDragging: (int handlerIndex, dynamic lowerValue, dynamic upperValue) { // 原有类型校验逻辑可以保留,避免类型转换问题 _lowerValue = lowerValue is int ? lowerValue : (lowerValue as num).toInt(); _upperValue = upperValue is int ? upperValue : (upperValue as num).toInt(); setState(() {}); }, )
- 如果确认库返回的值都是数值类型,也可以直接在参数赋值时做类型转换,同样满足严格静态分析规则:
onDragging: (handlerIndex, lowerValue, upperValue) { _lowerValue = (lowerValue as num).toInt(); _upperValue = (upperValue as num).toInt(); setState(() {}); },
内容的提问来源于stack exchange,提问作者Bill Turner
相关产品推荐
相关产品推荐

