平台异常(error):给定的字符串为空或为null(Given String is empty or null,null)- Flutter。

4

大家好,我正在尝试在我的应用程序中使用登录系统,但是进度条一直停留并显示“登录中”,但从未成功登录。我可以注册并且可以在Firestore上查看用户详细信息,但控制台的末尾却显示以下错误:"PlatformException(error, Given String is empty or null, null) error"请问是否有任何方法来解决这个错误?如果您有任何建议,请告知,谢谢!

          import 'package:cloud_firestore/cloud_firestore.dart';
          import 'package:firebase_auth/firebase_auth.dart';
          import 'package:flutter/cupertino.dart';
          import 'package:flutter/material.dart';
          import 'package:flutter/rendering.dart';
          import 'package:flutter/services.dart';
          import 'package:resat/src/pages/LoginPages/model/User.dart';
          import 'package:resat/src/pages/LoginPages/ui/home/HomeScreen.dart';
          import 'package:resat/src/pages/LoginPages/ui/services/Authenticate.dart';
          import 'package:resat/src/pages/LoginPages/ui/utils/helper.dart';
          import 'package:http/http.dart' as http;

          import '../../constants.dart' as Constants;
          import '../../main.dart';

          final _fireStoreUtils = FireStoreUtils();

          class LoginScreen extends StatefulWidget {
            @override
            State createState() {
              return _LoginScreen();
            }
          }

          class _LoginScreen extends State<LoginScreen> {
            TextEditingController _emailController = new TextEditingController();
            TextEditingController _passwordController = new TextEditingController();
            GlobalKey<FormState> _key = new GlobalKey();
            bool _validate = false;
            String email, password;

            @override
            Widget build(BuildContext context) {
              return Scaffold(
                appBar: AppBar(
                  backgroundColor: Colors.transparent,
                  iconTheme: IconThemeData(color: Colors.black),
                  elevation: 0.0,
                ),
                body: Form(
                  key: _key,
                  autovalidate: _validate,
                  child: ListView(
                    children: <Widget>[
                      Padding(
                        padding:
                        const EdgeInsets.only(top: 32.0, right: 16.0, left: 16.0),
                        child: Text(
                          'Sign In',
                          style: TextStyle(
                              color: Color(Constants.COLOR_PRIMARY),
                              fontSize: 25.0,
                              fontWeight: FontWeight.bold),
                        ),
                      ),
                      ConstrainedBox(
                        constraints: BoxConstraints(minWidth: double.infinity),
                        child: Padding(
                          padding:
                          const EdgeInsets.only(top: 32.0, right: 24.0, left: 24.0),
                          child: TextFormField(
                              textAlignVertical: TextAlignVertical.center,
                              textInputAction: TextInputAction.next,
                              validator: validateEmail,
                              onSaved: (String val) {
                                email = val;
                              },
                              onFieldSubmitted: (_) =>
                                  FocusScope.of(context).nextFocus(),
                              controller: _emailController,
                              style: TextStyle(fontSize: 18.0),
                              keyboardType: TextInputType.emailAddress,
                              cursorColor: Color(Constants.COLOR_PRIMARY),
                              decoration: InputDecoration(
                                  contentPadding:
                                  new EdgeInsets.only(left: 16, right: 16),
                                  fillColor: Colors.white,
                                  hintText: 'E-mail Address',
                                  focusedBorder: OutlineInputBorder(
                                      borderRadius: BorderRadius.circular(25.0),
                                      borderSide: BorderSide(
                                          color: Color(Constants.COLOR_PRIMARY),
                                          width: 2.0)),
                                  border: OutlineInputBorder(
                                    borderRadius: BorderRadius.circular(25.0),
                                  ))),
                        ),
                      ),
                      ConstrainedBox(
                        constraints: BoxConstraints(minWidth: double.infinity),
                        child: Padding(
                          padding:
                          const EdgeInsets.only(top: 32.0, right: 24.0, left: 24.0),
                          child: TextFormField(
                              textAlignVertical: TextAlignVertical.center,
                              validator: validatePassword,
                              onSaved: (String val) {
                                email = val;
                              },
                              onFieldSubmitted: (password) async {
                                await onClick(_emailController.text, password);
                              },
                              textInputAction: TextInputAction.done,
                              style: TextStyle(fontSize: 18.0),
                              cursorColor: Color(Constants.COLOR_PRIMARY),
                              decoration: InputDecoration(
                                  contentPadding:
                                  new EdgeInsets.only(left: 16, right: 16),
                                  fillColor: Colors.white,
                                  hintText: 'Password',
                                  focusedBorder: OutlineInputBorder(
                                      borderRadius: BorderRadius.circular(25.0),
                                      borderSide: BorderSide(
                                          color: Color(Constants.COLOR_PRIMARY),
                                          width: 2.0)),
                                  border: OutlineInputBorder(
                                    borderRadius: BorderRadius.circular(25.0),
                                  ))),
                        ),
                      ),
                      Padding(
                        padding:
                        const EdgeInsets.only(right: 40.0, left: 40.0, top: 40),
                        child: ConstrainedBox(
                          constraints: const BoxConstraints(minWidth: double.infinity),
                          child: RaisedButton(
                            color: Color(Constants.COLOR_PRIMARY),
                            child: Text(
                              'Log In',
                              style:
                              TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                            ),
                            textColor: Colors.white,
                            splashColor: Color(Constants.COLOR_PRIMARY),
                            onPressed: () async {
                              await onClick(
                                  _emailController.text, _passwordController.text);
                            },
                            padding: EdgeInsets.only(top: 12, bottom: 12),
                            shape: RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(25.0),
                                side:
                                BorderSide(color: Color(Constants.COLOR_PRIMARY))),
                          ),
                        ),
                      ),
                      Padding(
                        padding: const EdgeInsets.all(32.0),
                        child: Center(
                          child: Text(
                            'OR',
                            style: TextStyle(color: Colors.black),
                          ),
                        ),
                      ),

                    ],
                  ),
                ),
              );
            }

            onClick(String email, String password) async {
              if (_key.currentState.validate()) {
                _key.currentState.save();
                showProgress(context, 'Logging in, please wait...', false);
                User user =
                await loginWithUserNameAndPassword(email, password.trim());
                if (user != null)
                  pushAndRemoveUntil(context, HomeScreen(user: user), false);

              } else {
                setState(() {


                  _validate = true;
                });
              }
            }

            Future<User> loginWithUserNameAndPassword(String email,
                String password) async {
              try {
                AuthResult result = await FirebaseAuth.instance
                    .signInWithEmailAndPassword(email: email, password: password);
                DocumentSnapshot documentSnapshot = await FireStoreUtils.firestore
                    .collection(Constants.USERS)
                    .document(result.user.uid)
                    .get();
                User user;
                if (documentSnapshot != null && documentSnapshot.exists) {
                  user = User.fromJson(documentSnapshot.data);
                  user.active = true;
                  await _fireStoreUtils.updateCurrentUser(user, context);
                  hideProgress();
                  MyAppState.currentUser = user;
                }
                return user;
              } catch (exception) {
                hideProgress();
                switch ((exception as PlatformException).code) {
                  case 'ERROR_INVALID_EMAIL':
                    showAlertDialog(
                        context, 'Couldn\'t Authinticate', 'email address is malformed');
                    break;
                  case 'ERROR_WRONG_PASSWORD':
                    showAlertDialog(context, 'Couldn\'t Authinticate', 'wrong password');
                    break;
                  case 'ERROR_USER_NOT_FOUND':
                    showAlertDialog(context, 'Couldn\'t Authinticate',
                        'no user corresponding to the given email address');
                    break;
                  case 'ERROR_USER_DISABLED':
                    showAlertDialog(
                        context, 'Couldn\'t Authinticate', 'user has been disabled');
                    break;
                  case 'ERROR_TOO_MANY_REQUESTS':
                    showAlertDialog(context, 'Couldn\'t Authinticate',
                        'too many attempts to sign in as this user');
                    break;
                  case 'ERROR_OPERATION_NOT_ALLOWED':
                    showAlertDialog(context, 'Couldn\'t Authinticate',
                        'Email & Password accounts are not enabled');
                    break;
                }
                print(exception.toString());
                return null;
              }
            }

            @override
            void dispose() {
              _emailController.dispose();
              _passwordController.dispose();
              super.dispose();
            }
          }

你在哪一行遇到了错误? - Peter Haddad
我在登录时遇到错误,所有代码行都能正常工作,只是无法登录。 - Mehmet Reşat Demir
1个回答

5

您需要将_passwordController绑定到字段上:

child: TextFormField(
      textAlignVertical: TextAlignVertical.center,
      validator: validatePassword,
      onSaved: (String val) {
        email = val;
      },
      onFieldSubmitted: (password) async {
        await onClick(_emailController.text, _passwordController.text);
      },
      controller : _passwordController,
      textInputAction: TextInputAction.done,
      style: TextStyle(fontSize: 18.0),

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接