You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:07:40