如何在 dart 混合中编写任意的初始化代码?

mspsb9vt  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(100)

假设我有一个包公开了一个mixin,它通过API提供了一些可扩展性:

mixin ListenerModifier<T> {
  T get value;
  void addListener(Callback callback);
  void removeListener(Callback callback);
}

假设我想基于这个mixin创建一个"插件":

mixin PreviousValue<T> on ListenerModifier<T> {
  late T previous;

  const PreviousValue() {
    addListener(() => previous = value);
  }
}

(You也可以在其他包中定义插件,可能是为了公开Stream<T> getter。)
然后,用户可以随意使用任何插件,如下所示:

abstract class MyListener<T> with ListenerModifier<T>, PreviousValue<T> {}

问题是,mixin不能有像上面PreviousValue假设的构造函数。有一些OOP/体系结构的方法来解决这个问题吗?我最初想到的解决方法是强迫PreviousValue的用户(例如)在他们的MyListener构造函数中调用registerPreviousValue()方法,但这很容易出错。
相关:

rfbsl7qr

rfbsl7qr1#

我刚刚意识到,对于我给出的特定示例,我可以使用一种不同类型的插件系统,而无需mixin:

mixin ListenerModifierPluginAPI {
  T get value;
  void addListener(Callback callback);
  void removeListener(Callback callback);
}

abstract class ListenerModifier with ListenerModifierPluginAPI {
  T registerPlugin<T>(T Function(ListenerModifierPluginAPI) plugin) => plugin(this);
}

class MyListenerModifier extends ListenerModifier {
  late final PreviousValueState previousValueState;

  const MyListenerModifier() {
    previousValueState = registerPlugin(previousValuePlugin);
  }

  // ...
}

不过,这可能不适用于所有人。如果有人有不同的解决办法,我洗耳恭听。

相关问题