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

Flutter登录报错:Text Widget需非空字符串,response['message']为空

Flutter登录功能Text Widget非空错误解决

问题场景

在Flutter应用中实现用户登录功能时,持续收到错误提示:'data != null': A non-null String must be provided to a Text widget。调试后确认response['message']返回null,尝试添加非空判断、使用toString()方法均无法解决问题,核心问题指向response['message']的空值处理。

相关代码

Auth控制器类

class AuthController extends GetxController {
  AuthService authService = AuthService();
  ProjectApis projectApis = ProjectApis();

  String name = '';
  String email = '';
  String password = '';
  String confirmPassword = '';
  var isPasswordHidden = true.obs;

  
  Future loginUser(BuildContext context) async {
    buildLoader(context, message: 'Loading...');

    http.Response response = await authService.signInUser(
      email,
      password,
    );
    if (response.statusCode == 200) {
      Map<String, dynamic> responseData = json.decode(response.body);
      debugPrint(responseData.toString());
      debugPrint(responseData['message']);
      if (responseData["status"] == true) {
        User user = User.fromJson(responseData);

        UserPreferences().setUser(user);
        Navigator.pop(context);
        Get.offAll(() => BottomNavigation());
        return;
      } else {
        Navigator.pop(context);
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text(responseData['message']),
        ));

        return;
      }
    } else {
      Navigator.pop(context);

      showErrorDialog(context, message: "Server Error");
      return;
    }
  }
}

登录函数

Future<http.Response> signInUser(
    String email,
    String password,
  ) async {
    Map data = {
      'email': email,
      'password': password,
    };
    var body = json.encode(data);
    var url = Uri.parse(projectApis.loginUrl);

    var response = await client.post(
      url,
      body: body,
      headers: projectApis.headers,
    );
    return response;
  }

User模型类

User userFromJson(String str) => User.fromJson(json.decode(str));

String userToJson(User data) => json.encode(data.toJson());

class User {
  User({
    this.id,
    this.name,
    this.email,
    this.password,
    this.passwordConfirm,
    this.token,
  });

  int? id;
  String? name;
  String? email;
  String? password;
  String? passwordConfirm;
  String? token;

  String applicationDirPath = "";

  factory User.fromJson(Map<String, dynamic> json) => User(
        id: json["id"],
        name: json["name"],
        email: json["email"],
        password: json["password"],
        passwordConfirm: json["passwordConfirm"],
        token: json["token"],
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "name": name,
        "email": email,
        "password": password,
        "passwordConfirm": passwordConfirm,
        "token": token,
      };
}

解决方案

1. 空值兜底处理

Dart空安全要求Text widget必须接收非空字符串,因此需要给responseData['message']设置默认值,使用**空合并运算符??**确保永远传递合法字符串:

修改Auth控制器中SnackBar的代码:

ScaffoldMessenger.of(context).showSnackBar(SnackBar(
  content: Text(responseData['message'] ?? '登录失败,请检查账号或密码'),
));

2. 调试语句的安全处理

原代码中的debugPrint(responseData['message'])也会因为null报错,同样需要处理:

debugPrint(responseData['message']?.toString() ?? '无错误信息');

3. 后端返回结构校验

如果后端在status为false时可能不返回message字段,建议先判断字段是否存在:

String errorMessage = '';
if (responseData.containsKey('message') && responseData['message'] != null) {
  errorMessage = responseData['message'];
} else {
  errorMessage = '登录失败,请稍后重试';
}

ScaffoldMessenger.of(context).showSnackBar(SnackBar(
  content: Text(errorMessage),
));

4. 空安全严格校验

如果使用的是Dart空安全版本,确保变量类型正确,避免隐式转换问题。可以将responseData['message']显式转换为可空字符串,再处理:

String? message = responseData['message'];
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
  content: Text(message ?? '未知错误'),
));

内容的提问来源于stack exchange,提问作者Kennedy Owusu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:36:20