You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中如何限制函数的回调参数仅为VoidCallback或ValueChanged

Dart 3.0及以上版本(推荐方案)

利用Dart 3新增的联合类型语法,可以直接在编译期就限制参数类型,不符合的代码会直接报编译错误:

import 'package:flutter/foundation.dart';

void main() {
  foo(() {}); // VoidCallback类型,调用合法
  foo((int value) {}); // ValueChanged<int>类型,调用合法
  // foo((a, b) {}); // 多参数函数,编译阶段直接报错
}

// 用|限定参数只能是两种函数类型的其中一种
void foo(VoidCallback | ValueChanged callback) => null;

如果需要限定ValueChanged的参数类型,可以进一步指定泛型,比如ValueChanged<int>就只能接受入参为int的单参数回调。

Dart 3.0以下版本

低版本Dart不支持联合类型,你可以在函数内部增加运行时校验,调试阶段可以通过断言快速发现不符合要求的入参:

import 'package:flutter/foundation.dart';

void main() {
  foo(() {}); // 合法
  foo((String content) {}); // 合法
  // foo((p1, p2) => print('$p1 $p2')); // 调试模式下会触发断言提示
}

void foo(Function callback) {
  // 类型校验
  assert(
    callback is VoidCallback || callback is ValueChanged,
    'callback仅支持VoidCallback和ValueChanged两种类型',
  );
  
  // 业务逻辑示例:根据不同类型调用回调
  if (callback is VoidCallback) {
    callback();
  } else if (callback is ValueChanged) {
    callback('测试参数');
  }
}

内容的提问来源于stack exchange,提问作者iDecode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 18:27:03