Dart中如何在回调内访问外部变量?编译报错求助
问题分析与解决
你完全可以在builder回调里访问application变量,编译报错的根源和变量访问权限无关,是const关键字的使用错误。
错误原因
你给AlertDialog加上了const修饰符,这要求该组件的所有参数必须是编译时常量。但application.title是函数参数传入的运行时变量,它的值只能在程序运行时确定,不属于编译时常量,因此编译器抛出Error: Not a constant expression。
修复代码
去掉AlertDialog前的const关键字即可正常运行:
ListTile applicationListTile(Application application) { return ListTile( onTap: () => showDialog<String>( context: context, builder: (BuildContext context) => AlertDialog(title: Text(application.title), content: Text("Test body"))), title: Text(application.title, style: const TextStyle( fontWeight: FontWeight.w500, fontSize: 20, )), subtitle: Text(application.path), leading: Icon( Icons.javascript, color: Colors.blue[500]), ); }
补充说明
- Dart的闭包特性允许回调函数捕获外层作用域的变量,所以
application在builder回调里是完全可访问的,之前的报错只是const的误用导致的。 const修饰符仅适用于所有参数都是编译时常量的组件,这样可以复用组件实例优化性能;只要组件有一个参数是运行时变量,就不能使用const修饰。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

