(Dart) 如何执行列表中的每个函数?

(Dart) How to execute each Function in a List?

TL;DR: 我正在尝试将一个函数列表传递给另一个 class,然后它应该执行每个函数。

为什么? 我需要在 Flutter 中响应 App Intents。我的想法是将该逻辑分离到另一个 Widget 中,然后将其传递给一个函数列表。 App注册onResume事件后,应该执行相应的函数。

怎么办? 目前,我的模型如下所示:

class LifecycleMethods {
  final List<void> onPaused;
  final List<void> onResumed;
  final List<void> onInactive;
  final List<void> onSuspending;

  LifecycleMethods(
      {this.onPaused, this.onInactive, this.onResumed, this.onSuspending});
}

传递给这个 class:(受 this article 启发)

class AppStateObserver extends StatefulWidget {
  final Widget child;
  final LifecycleMethods lifecycleMethods;

  const AppStateObserver({Key key, @required this.child, this.lifecycleMethods})
      : super(key: key);

  @override
  _AppStateObserverState createState() => _AppStateObserverState();
}

class _AppStateObserverState extends State<AppStateObserver>
    with WidgetsBindingObserver {
  final Widget child;
  final LifecycleMethods lifecycleMethods;

  _AppStateObserverState({@required this.child, this.lifecycleMethods});

  @override
  Widget build(BuildContext context) => child;

  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
      // Execute every item in lifecycleMethods.onPaused
    }
  }
}

WidgetBindingObserver 似乎是访问 App 生命周期的唯一途径。我将方法存储在 lifecycleMethods 变量中。在didChangeAppLifecycleState里面,最后应该会执行相应的函数。

现在 - 如何正确执行列表中的函数?这可能吗? 如果有更干净、更好的方法解决这个问题,请指正!

感谢

问题是,您有 List<void>。您需要将其更改为 List<Function>.

class LifecycleMethods {
  final List<Function> onPaused;
  final List<Function> onResumed;
  final List<Function> onInactive;
  final List<Function> onSuspending;

  LifecycleMethods(
      {this.onPaused, this.onInactive, this.onResumed, this.onSuspending});
}

funcOne() => print('one');

funcTwo() { 
  print('two');
}


...

LifecycleMethods methods = LifecycleMethods(onPaused: [funcOne,funcTwo,()=>print('func anonym')]);
methods.onPaused.forEach((func) => func()); //run every function in onPaused

...

这假定您有不带参数的 void 函数。例如,如果您的函数采用字符串和 return 布尔值,请将它们更改为:

...
List<bool Function(String a)> onPaused;
...

...
typedef MyFunc = bool Function(String a)
List<MyFunc> onPaused;
...