Flutter空安全报错:Function?类型无法直接作为函数调用如何解决
问题原因
Dart 空安全规则下,通过下标访问Map时返回值始终是可空类型,因为无法保证传入的key一定在Map中存在。你当前代码中直接调用pageName_pageFunction_map[xxx](),拿到的是Function?可空类型,无法直接执行,因此触发报错。
修复方案
可以根据你的业务场景选择以下任意一种修复方式:
方案1:使用?.call调用 + 空值兜底
不需要修改Map定义,仅调整调用逻辑,同时自动处理key不存在的异常场景:
void main() { // 调用时用?.call,空值默认返回null PageName? nextPage = pageName_pageFunction_map[PageName.welcomePage]?.call(); if (nextPage != null) { while (true) { PageName? nextPage2 = pageName_pageFunction_map[nextPage]?.call(); if (nextPage2 != null) { nextPage = nextPage2; } else { // 无对应页面时退出循环,避免死循环 break; } } } }
方案2:非空断言调用
如果你确认Map已经全量覆盖了所有PageName枚举值,不会出现key不存在的情况,可以直接用!断言非空后调用:
void main() { // 断言key一定存在,直接调用函数 PageName nextPage = pageName_pageFunction_map[PageName.welcomePage]!(); while (true) { PageName nextPage2 = pageName_pageFunction_map[nextPage]!(); nextPage = nextPage2; } }
注意:该方案仅适用于100%确认所有用到的PageName都有对应映射的场景,否则运行时会抛出空异常。
可选优化:明确函数类型
你可以修改Map的类型定义,提前在编译期校验函数返回值是否符合要求,避免隐式类型问题:
// 明确Map的值是无参、返回PageName的函数 Map<PageName, PageName Function()> pageName_pageFunction_map = { PageName.welcomePage: showWelcomePage, PageName.register: showRegisterPage, PageName.login: showLoginPage, PageName.editProfile: showEditProfile, PageName.showProfile: showUserProfile, PageName.resetPassword: showResetPassword, PageName.errorUserExists: showErrorUserExists, };
内容的提问来源于stack exchange,提问作者Gal
相关产品推荐
相关产品推荐

