Flutter Dart-允许基本方法使用任何参数

Flutter Dart-允许基本方法使用任何参数,flutter,dart,Flutter,Dart,我需要一个可以接受任何参数的基本方法。您可以在不为参数创建新类的情况下执行此操作吗?我认为唯一的方法是指定一个参数并为该参数创建一个类型?所以我做了这件事: 基类中的方法: void onSubmitPressed(dynamic args) {} 扩展类: @override void onSubmitPressed(dynamic args) { args.passwordViewModel.email = entity.email; args.passwordVi

我需要一个可以接受任何参数的基本方法。您可以在不为参数创建新类的情况下执行此操作吗?我认为唯一的方法是指定一个参数并为该参数创建一个类型?所以我做了这件事:

基类中的方法:

void onSubmitPressed(dynamic args) {}
扩展类:

  @override
  void onSubmitPressed(dynamic args) {
    args.passwordViewModel.email = entity.email;
    args.passwordViewModel.nickName = entity.nickName;

    args.controller.nextPage(
        duration: const Duration(milliseconds: 800),
        curve: Curves.easeInOutCubic);

    putLocal();
    super.onSubmitPressed(args);
  }
它被称为:

viewModel.onSubmitPressed(SubmitArgs(controller, passwordViewModel))

class SubmitArgs {
  const SubmitArgs(this.controller, this.passwordViewModel);
  final PageController controller;
  final RegisterPasswordViewModel passwordViewModel;
}
void onSubmitPressed<T>(T args) {}

 @override
  void onSubmitPressed<SubmitArgs>(SubmitArgs args) {
    args.passwordViewModel.email = entity.email;
    args.passwordViewModel.nickName = entity.nickName;

    args.controller.nextPage(
        duration: const Duration(milliseconds: 800),
        curve: Curves.easeInOutCubic);

    putLocal();
    super.onSubmitPressed(args);
  }
class Class2 extends BaseClass {
  @override
  void onSubmitPressed({void args}) {
    // TODO: implement onSubmit
  }
}
它起作用了。不过,我并不真的喜欢创建Args类。所以我很想知道我是否能避免这种情况?此外,如果我确实必须创建它,我还可以使用泛型使它具有类型安全性,而不仅仅是在基础中说
dynamic
。我尝试使用泛型使其类型安全,如下所示:

viewModel.onSubmitPressed(SubmitArgs(controller, passwordViewModel))

class SubmitArgs {
  const SubmitArgs(this.controller, this.passwordViewModel);
  final PageController controller;
  final RegisterPasswordViewModel passwordViewModel;
}
void onSubmitPressed<T>(T args) {}

 @override
  void onSubmitPressed<SubmitArgs>(SubmitArgs args) {
    args.passwordViewModel.email = entity.email;
    args.passwordViewModel.nickName = entity.nickName;

    args.controller.nextPage(
        duration: const Duration(milliseconds: 800),
        curve: Curves.easeInOutCubic);

    putLocal();
    super.onSubmitPressed(args);
  }
class Class2 extends BaseClass {
  @override
  void onSubmitPressed({void args}) {
    // TODO: implement onSubmit
  }
}
void onSubmitPressed(T参数){
@凌驾
提交时无效(提交目标参数){
args.passwordViewModel.email=entity.email;
args.passwordViewModel.nickName=entity.nickName;
args.controller.nextPage(
持续时间:常量持续时间(毫秒:800),
曲线:曲线。easeInOutCubic);
putLocal();
super.onSubmitPressed(args);
}
它似乎不知道它在扩展基类,并说:

未为类型“Object”定义getter“passwordViewModel”


我是否可以使用泛型使其类型安全,或者甚至更好,完全避免强类型,只需传入任何内容?

如果您正在寻找“可变数量的函数参数”“语言功能(如Kotlin),Dart没有。实际功能请求

可以将列表用作函数参数:

  void onSubmitPressed(List<dynamic> args) {
    final arg0 = args[0];
    final arg1 = args[1];
  }
没有此函数参数的子类如下所示:

viewModel.onSubmitPressed(SubmitArgs(controller, passwordViewModel))

class SubmitArgs {
  const SubmitArgs(this.controller, this.passwordViewModel);
  final PageController controller;
  final RegisterPasswordViewModel passwordViewModel;
}
void onSubmitPressed<T>(T args) {}

 @override
  void onSubmitPressed<SubmitArgs>(SubmitArgs args) {
    args.passwordViewModel.email = entity.email;
    args.passwordViewModel.nickName = entity.nickName;

    args.controller.nextPage(
        duration: const Duration(milliseconds: 800),
        curve: Curves.easeInOutCubic);

    putLocal();
    super.onSubmitPressed(args);
  }
class Class2 extends BaseClass {
  @override
  void onSubmitPressed({void args}) {
    // TODO: implement onSubmit
  }
}
不带其他地方的参数调用SubmitPressed上的

final class2 = Class2();
class2.onSubmitPressed();

谢谢,这个看起来不错。当没有参数时,这是否适用于传递空值?我必须从您的解决方案中删除
extensed Args
,以允许传递void类型,并执行以下操作:`@override void onSubmitPressed(void Args){super.onSubmitPressed(Args);`。显式地传递无效的参数感觉有点尴尬,但这是必要的吗?是的,您可以使用
void
。没有必要删除
扩展参数,请参阅我的更新答案。谢谢。它抱怨
Class2
没有给
BaseClass
提供泛型类型。它抱怨了两次:“dynamic”不扩展“Args”。请尝试使用是或是“Args”子类的类型。此外:类型“Class2”声明有2个类型参数,但给出了1个类型参数。请尝试调整类型参数的数量以匹配类型参数的数量。(仅供参考,我有另一个类型参数,这就是为什么它说有2个类型参数)。哦,是的,最后关于
扩展Args
你是对的,因为
dynamic
void
不扩展“Args”。让我们尝试删除泛型约束。至于
Class2没有为基类提供泛型类型
-是运行时错误还是静态分析器问题?这是静态分析器错误。