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
相关产品推荐
相关产品推荐

