【问题标题】:ERROR:flutter/lib/ui/ui_dart_state.cc(177) Unhandled Exception: NoSuchMethodError: The getter 'length' was called on null错误:flutter/lib/ui/ui_dart_state.cc(177) 未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'length'
【发布时间】:2021-03-12 05:17:27
【问题描述】:

我正在尝试使用颤振和 laravel api 构建应用程序。在我开始实现login 功能之前一切都很好。我收到此错误[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The getter 'length' was called on null. 你能告诉我我的代码有什么问题吗? 万一我犯了一个愚蠢的错误,请不要生气,我才刚刚开始编程。 非常感谢! 登录功能代码

    var _userService = UserService();
    var registeredUser = await _userService.login(user);
    var result = json.decode(registeredUser.body);
    print(result);
    if(result['success']['result']== true){
      SharedPreferences _prefs = await SharedPreferences.getInstance();
      _prefs.setInt('userId', result['success']['user']['id']);
      _prefs.setString('userName', result['success']['user']['name']);
      _prefs.setString('userPhone', result['success']['user']['phone']);
      _prefs.setString('userEmail', result['success']['user']['email']);
      _prefs.setString('token', result['success']['token']);
      // Timer(Duration(seconds: 2), () {
      //   Navigator.pop(context);
      //   Navigator.popAndPushNamed(context, DashboardScreen.id);
      // });
      Navigator.push(
          context, MaterialPageRoute(builder: (context) => HomeScreen()));
    }  else {
      displayToastMessage('Failed to login!', context);
    }
  }```

When I press `Login button` this is how I call the `login` function.
```onPressed: () {
          if(!emailTextEditingController.text
              .contains("@")) {
            displayToastMessage(
                "Not a valid email address", context);
          }
          else if(passwordTextEditingController.text.length < 6) {
            displayToastMessage(
                "Password must be at least 6 characters", context);
          }  else {
            var user = User();
            // user.name = nameTextEditingController.text;
            user.email = emailTextEditingController.text;
            // user.phone = phoneTextEditingController.text;
            user.password = passwordTextEditingController.text;
            _login(context, user);
          }
        },```

This is the UsersService Code for login
`login(User user) async {
    return await _repository.httpPost('login', user.toJson());
  }`

and `_repositpry` is the one sending request to the `api`
here is how it is implemented 
`  String _baseUrl = 'https://api.adikatour.com/api';
   httpPost(String api, data) async {
    return await http.post(_baseUrl + "/" + api, body: data);
  }`

and here is the api code for login
` public function login(){ 
        if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){ 
            $user = Auth::user(); 
            $success['token'] =  $user->createToken('MyApp')->accessToken; 
            $success['name'] =  $user->name;
            $success['user'] =  $user;
            return response()->json(['success' => $success], $this->successStatus); 
        } 
        else{
            return response()->json(['error'=>'Unauthorised'], 401); 
        } 
    }`

can you please tell me why I am getting this error? thanks again!

【问题讨论】:

  • 如果你不能确定一个字符串不为空,在得到它的长度之前总是检查它是否为空。在您的情况下,它将是:passwordTextEditingController?.text != null &amp;&amp; passwordTextEditingController.text.length &lt; 6

标签: laravel flutter laravel-api


【解决方案1】:

按下时试试这个:-

onPressed: () {
      if(!emailTextEditingController.text
          .contains("@")) {
        displayToastMessage(
            "Not a valid email address", context);
      }
      else if (passwordTextEditingController.text is String && ((passwordTextEditingController.text?.length) ?? 0) < 6) {
        displayToastMessage(
            "Password must be at least 6 characters", context);
      }
     else if (!(passwordTextEditingController.text is String)){
        displayToastMessage(
            "Password must not be empty", context);
    }
     else {
        var user = User();
        // user.name = nameTextEditingController.text;
        user.email = emailTextEditingController.text;
        // user.phone = phoneTextEditingController.text;
        user.password = passwordTextEditingController.text;
        _login(context, user);
      }
    },

【讨论】:

  • 感谢您的帮助@sajith lakmal,现在错误消失了,但是在最后一个else if 语句之后没有执行代码。我尝试在控制台上print,但在那一行之后没有任何事情发生。请问有什么建议吗?
  • 我已编辑答案检查尝试新答案。 else 代码块没有被执行,因为else if 检查密码是否为字符串的语句停止了 if 语句的流程。
  • 是的,我检查了新答案,但仍然收到此错误[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The getter 'length' was called on null. E/flutter ( 4538): Receiver: null E/flutter ( 4538): Tried calling: length
  • 你是否在passwordTextEditingController.text中添加了问号(?)?.length
  • 是的,我删除它还是一样。我不知道为什么...抱歉给您添麻烦了兄弟
【解决方案2】:

最后,我解决了这个问题。 这就是我构建我使用的模型的方式。

class User {
  int id;
  String name;
  String email;
  String phone;
  String password;

  toJson(){
    return {
      'id' : id.toString(),
      'name' : name,
      'email' : email,
      'phone' : phone,
      'password' : password,
    };
  }
}

但在 _login 函数中,只设置了电子邮件和密码。由于我的服务器不允许 phonename 字段为空值,因此我必须将这些字段转换为非空值。所以,我像这样转换了用户模型。然后就解决了。

class User {
  int id;
  String name;
  String email;
  String phone;
  String password;

  toJson(){
    return {
      'id' : id.toString(),
      'name' : name.toString(),
      'email' : email.toString(),
      'phone' : phone.toString(),
      'password' : password.toString(),
    };
  }
}

谢谢你们帮助我,我真的很感激。特别感谢@sajith lakmal

【讨论】:

    猜你喜欢
    • 2021-04-04
    • 2021-02-28
    • 2021-09-23
    • 1970-01-01
    • 2019-07-21
    • 2020-09-28
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多