Длина получателя 'длина' была вызвана нулем для моего виджета _showErrorMessage - PullRequest
0 голосов
/ 04 июля 2019

Я пытался показать сообщения об ошибках для моей страницы входа, но это не сработало. Все остальное работает нормально, но когда я хочу использовать метод _showErrorMessage (), приложение будет разрушено.

Это часть всех моих кодов, в которых используется метод _showErrorMessage ().

class LogInPage extends StatefulWidget {
LogInPage({this.auth, this.onSignedIn});
final BaseAuth auth;
final VoidCallback onSignedIn;


@override
_LogInPageState createState() => _LogInPageState();
}

enum FormMode { LOGIN, SIGNUP }

class _LogInPageState extends State<LogInPage> {
final _formKey = new GlobalKey<FormState>();

String _email;
String _password;
String _errorMessage = '';

FormMode _formMode = FormMode.LOGIN;
bool _isIos;
bool _isLoading;

// Check if form is valid before perform login or signup
bool _validateAndSave() {
final form = _formKey.currentState;
if (form.validate()) {
  form.save();
  return true;
  }
return false;
}

// Perform login or signup
void _validateAndSubmit() async {
setState(() {
  _errorMessage = "";
  _isLoading = true;
});
if (_validateAndSave()) {
  String userId = "";
  try {
    if (_formMode == FormMode.LOGIN) {
      userId = await widget.auth.signIn(_email, _password);
      print('Signed in: $userId');
    } else {
      userId = await widget.auth.signUp(_email, _password);
      widget.auth.sendEmailVerification();
      _showVerifyEmailSentDialog();
      print('Signed up user: $userId');
    }
    setState(() {
      _isLoading = false;
    });

    if (userId != null && userId.length > 0 && _formMode == FormMode.LOGIN) {
      widget.onSignedIn();
    }

  } catch (e) {
    print('Error: $e');
    setState(() {
      _isLoading = false;
      if (_isIos) {
        _errorMessage = e.details;
      } else
        _errorMessage = e.message;
    });
    }
  }
}


@override
void initState() {
_errorMessage = "";
_isLoading = false;
super.initState();
 }

void _changeFormToSignUp() {
_formKey.currentState.reset();
_errorMessage = "";
setState(() {
  _formMode = FormMode.SIGNUP;
  });
 }

 void _changeFormToLogin() {
_formKey.currentState.reset();
_errorMessage = "";
setState(() {
  _formMode = FormMode.LOGIN;
});
}


@override
Widget build(BuildContext context) {
_isIos = Theme.of(context).platform == TargetPlatform.iOS;
return new Scaffold(
    appBar: new AppBar(
      title: new Text("Organizer"),
      backgroundColor: Colors.blueAccent,
    ),
    body: Stack(
      children: <Widget>[
        _showBody(),
        _showCircularProgress(),
      ],
    ));
    }



  Widget _showBody(){
   return new Container(
    padding: EdgeInsets.all(16.0),
    child: new Form(
      key: _formKey,
      child: new ListView(
        shrinkWrap: true,
        children: <Widget>[
          _showEmailInput(),
          _showPasswordInput(),
          _showPrimaryButton(),
          _showSecondaryButton(),
          _showErrorMessage(),
        ],
      ),
    ));
     }
    Widget _showErrorMessage() {
    if (_errorMessage.length > 0 && _errorMessage != null) {
   return new Text(
    _errorMessage,
    style: TextStyle(
        fontSize: 13.0,
        color: Colors.red,
        height: 1.0,
        fontWeight: FontWeight.w300),
  );
} else {
  return new Container(
    height: 0.0,
  );
 }
}

Я понимаю, что означает эта ошибка, но я не знаю, как ее решить. Пожалуйста, помогите мне, большое спасибо:)

1 Ответ

0 голосов
/ 04 июля 2019

Измените этот код

 if (_errorMessage.length > 0 && _errorMessage != null) 

на это:

 if (_errorMessage != null && _errorMessage.length > 0) 

Объяснение
Когда объект нулевой, нет свойств для доступа.Сначала вы проверяли свойство длины, даже когда объект был нулевым.Перемещение нулевой проверки сначала гарантирует, что свойства не будут доступны для нулевого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...