(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;
...
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;
...