Dart中Undefined name 'context'错误解决(禁用dart.js库)
解决Flutter中S.of(context)报Undefined name 'context'错误的方案
问题背景
在ValidatorDef类的validatorEmail静态方法中调用S.of(context)时触发错误:Undefined name 'context',要求不能使用dart.js库解决。
核心原因
静态方法属于类本身,无法直接访问Flutter的BuildContext——因为context是与Widget树绑定的实例对象属性,并非类级别的变量。
可行解决方法
方法1:给验证方法添加context参数
直接将BuildContext作为参数传入每个静态验证方法,这样就能在方法内部调用S.of(context)获取多语言文本,同时建议把所有硬编码的阿拉伯语字符串替换为多语言key,保持代码一致性。
修改后的代码:
import '../../generated/l10n.dart'; import 'package:flutter/material.dart'; class ValidatorDef { static String? validatorEmail(BuildContext context, val) { if (val == null || val.isEmpty) { return S.of(context).validator_Email; } if (!val.contains("@") || !val.contains(".")) { return S.of(context).validator_valid_email; // 需在S类中定义对应多语言key } return null; } static String? validatorPassword(BuildContext context, val) { if (val == null || val.isEmpty) { return S.of(context).validator_enter_password; } return null; } static String? validatorName(BuildContext context, val) { if (val == null || val.isEmpty) { return S.of(context).validator_enter_name; } return null; } static String? validatorPhone(BuildContext context, val) { if (val == null || val.isEmpty) { return S.of(context).validator_enter_phone; } if ((val.toString()).length < 11) { return S.of(context).validator_invalid_phone; } return null; } static String? validatorRegion(BuildContext context, val) { if (val == null || val.isEmpty) { return S.of(context).validator_select_region; } return null; } }
调用示例:
TextFormField( validator: (val) => ValidatorDef.validatorEmail(context, val), )
方法2:将类改为非静态,初始化时传入context
如果不想每次调用都传context,可以把ValidatorDef改成普通类,在实例化时传入context并保存为成员变量,后续方法直接使用该变量。
修改后的代码:
import '../../generated/l10n.dart'; import 'package:flutter/material.dart'; class ValidatorDef { final BuildContext context; ValidatorDef(this.context); String? validatorEmail(val) { if (val == null || val.isEmpty) { return S.of(context).validator_Email; } if (!val.contains("@") || !val.contains(".")) { return S.of(context).validator_valid_email; } return null; } String? validatorPassword(val) { if (val == null || val.isEmpty) { return S.of(context).validator_enter_password; } return null; } // 其余方法同理,去掉static修饰符 }
调用示例:
// 在Widget中实例化 final validator = ValidatorDef(context); // 使用验证方法 TextFormField( validator: validator.validatorEmail, )
内容的提问来源于stack exchange,提问作者Shaimaa Fathy
相关产品推荐
相关产品推荐

