背景:
我一直在研究如何使用 dart 代码使用 Map 传递函数。然而,我现在很难过。在使用空安全时使用 DartPad 时,我从以下代码中得到了一个意外的空值:
void main() {
Map<String, Function> fruits = Map();
fruits['apple'] = appleDescription;
fruits['banana'] = bananaDescription;
fruits['grape'] = grapeDescription;
exec(fruits['grape']!);
}
void appleDescription() => print('This fruit tastes like red!');
void bananaDescription() => print('This fruit tastes like yellow!');
void grapeDescription() => print('This fruit tastes like purple!');
void exec(Function f) {
print(f());
}
DartPad 控制台如下图所示:
问题:
我认为答案很容易,但我已经为此苦苦挣扎了一段时间。我的问题是:
我只希望,“这种水果尝起来像紫色!” 已在控制台中打印,所以我必须在这里遗漏一些东西。我是从地图中正确传递这个函数,还是有一种更安全的传递方式?
我想知道为什么在调用 exec() 函数时必须使用 bang 运算符。由于我已经定义了 fruits 映射包含 <String, Function>,编译器会理解它必须存在。我错过了什么?
再次,提前感谢您的任何建议,我们非常感谢社区接受。
更新:
我使用以下代码删除了 bang 运算符,并在下面的答案中给出了更正:
void main() {
Map<String, Function> fruits = Map();
fruits['apple'] = appleDescription;
fruits['banana'] = bananaDescription;
fruits['cranberry'] = grapeDescription;
exec(fruits['cranberry']??= (){print('');});
}
void appleDescription() => print('This fruit tastes like red!');
void bananaDescription() => print('This fruit tastes like yellow!');
void grapeDescription() => print('This fruit tastes like purple!');
void exec(Function f) {
f();
}