【问题标题】:(Dart) How to execute each Function in a List?(Dart)如何执行列表中的每个函数?
【发布时间】:2020-10-04 19:45:24
【问题描述】:

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

为什么? 我需要在 Flutter 中响应 App Intents。我的想法是将该逻辑分离到另一个小部件中,然后将其传递给函数列表。 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});
}

传递给这个类:(灵感来自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 生命周期的唯一方法。我将方法存储在生命周期方法变量中。在 didChangeAppLifecycleState 内部,它应该最终执行相应的函数。

现在 - 如何正确执行列表中的函数?这甚至可能吗? 请纠正我,如果有更清洁,更好的方法来解决这个问题!

谢谢

【问题讨论】:

  • 可以使用List 类的forEach 方法。 doc 。你会发现使用它的例子。
  • @dev-aentgs 看到了,试过了。但这并不能解决我执行列表项的问题。例如。使用forEach((element) { element(); }) 不起作用。
  • 使用lifecycleMethods.onPaused.forEach((e) { e(); })会抛出什么错误?
  • 检查@ZeRj 的答案。

标签: list function flutter dart execute


【解决方案1】:

问题是,你有List&lt;void&gt;。您需要将其更改为List&lt;Function&gt;

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 函数。如果你的函数接受一个字符串并返回一个布尔值,例如将它们更改为:

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

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

【讨论】:

  • 我最初忽略了List&lt;void&gt;,使用VoidCallback 更改为List&lt;Function&gt;List&lt;VoidCallback&gt; 应该使List 的元素可执行。
  • 谢谢,这实际上解决了我的问题! (加上一些额外的知识^^)
猜你喜欢
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多