Flutter,Dart。创建匿名类

18
也许这是一个非常愚蠢的问题,但我不相信没有相关资源来描述它,即使在官方文档中也是如此。我正在尝试为下一个函数创建匿名类。

enter image description here

如何在Dart中创建带有自定义函数的匿名类,类似于Kotlin中的next?
Handler(Looper.getMainLooper()).post(Runnable() {
    @override
    open fun run() {
        //...
    }

    private fun local() {
       //....
    }
})
3个回答

13

Dart不支持创建匿名类。

您试图做的是不可能的。

另一方面,您可以创建匿名函数。因此,您可以使用它来模拟匿名类。

这个想法是为您的抽象类添加一个构造函数,将其实现延迟到回调函数中。

abstract class Event {
  void run();
}

class _AnonymousEvent implements Event {
  _AnonymousEvent({void run()}): _run = run;

  final void Function() _run;

  @override
  void run() => _run();
}

Event createAnonymousEvent() {
  return _AnonymousEvent(
    run: () => print('run'),
  );
}

它并不严格等同于匿名类,更接近于装饰器模式。但它应该涵盖大多数用例。


谢谢你。嗯,我能定义内联新类实例的方法吗? - GensaGames
1
不可以,但你可以使用函数来制作类似的东西。 - Rémi Rousselet
你能提供链接吗?谢谢。 - GensaGames
1
@RémiRousselet 我想这是有效的 var body = {"data": {"uid":uid}}; - Rasmus Christensen

3

这是一种替代方法,但不完全等同:

问题,例如: 我想在我的代码中内联实现OnChildClickListener,而不使用类。对于此方法:

void setOnChildClickListener(OnChildClickListener listener) {
    ...
}

不要这样做:

abstract class OnChildClickListener {
  bool onChildClick(int groupPosition, int childPosition);
}

请使用以下内容:

typedef OnChildClickListener = Function(int groupPosition, int childPosition);

你可以按照以下方式在代码中实现它:

listView.setOnChildClickListener((int groupPosition, int childPosition) {
  // your code here
});

换句话说,不要使用抽象类,而是使用typedef。

1
Dart 3有记录类型,类似于C#中的匿名类。
  var record0 = ('String', 5);
  print(record0);

具有内置的getter方法,可以是按位置或按名称获取:
  var record = ('first', a: 2, b: true, 'last');
  print("${record.a}, ${record.$1}");

记录类型使用鸭子类型进行相等性判断。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接