Необработанное исключение: неудачное утверждение: строка 183 поз. 12: ’email!= null’: неверно

#flutter #firebase-authentication

#флаттер #firebase-аутентификация

Вопрос:

Я использую Flutter для создания регистрационной формы с использованием аутентификации Firebase, но это сообщение продолжает отображаться, когда я пытаюсь выполнить аутентификацию при попытке показать пользователю сообщение об ошибке регистрации с помощью Scaffold.of(context).showSnackBar SnackBar(content: Text(e.message) виджета регистрации при

Сначала я создал аутентификацию.файл dart

 import 'package:firebase_auth/firebase_auth.dart';

class Auth {
final FirebaseAuth _auth = FirebaseAuth.instance;

 //Sign up method
Future SignupClass(String email, String password) async {
final UserCredential user = await _auth.createUserWithEmailAndPassword(
        email: email, password: password);
}
  

Затем я создал этот класс TextField для модуляции моего кода

 class Textfield extends StatelessWidget {
final String hint;
final IconData icon;
final Function savingData;
String _emptyMessage(String str) {
switch (hint) {
  case 'Enter your name':
    return 'Name is required';
  case 'Enter your e-mail':
    return 'Email is required';
  case 'Enter your Password':
    return 'Password is required';
}
}

Textfield(
  {@required this.savingData, @required this.hint, @required this.icon});
@override
Widget build(BuildContext context) {
return Padding(
  padding: const EdgeInsets.symmetric(horizontal: 20.0),
  child: TextFormField(
    validator: (value) {
      if (value.isEmpty) {
        return _emptyMessage(hint);
      }
      return null;
    },
    onSaved: savingData
    }}
  

и это виджет Sig-up

   class SignupScreen extends StatelessWidget {
static String id = '/SignupScreen';
GlobalKey<FormState> _globalKey = GlobalKey<FormState>();
String _email, _password, _name;
final _auth = Auth();
@override
Widget build(BuildContext context) {
return Scaffold(Textfield(
          hint: 'Enter your name',
          icon: Icons.person,
          savingData: (value) {
            _name = value;
          },
        ),
        SizedBox(
          height: height * .02,
        ),
        Textfield(
          hint: 'Enter your e-mail',
          icon: Icons.email,
          savingData: (value) {
            _email =value;
          },
        ),
        SizedBox(
          height: height * .02,
        ),
        Textfield(
          hint: 'Enter your Password',
          icon: Icons.lock,
          savingData: (value) {
            _password = value;
          },
        ),
        SizedBox(
          height: height * .05,
        ),
        Padding(
          padding: const EdgeInsets.symmetric(horizontal: 120.0),
          child: Builder(
            builder: (context) => RaisedButton(
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(20.0)),
                child: Text(
                  'Register',
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.black,
                onPressed: () async {
                  if (_globalKey.currentState.validate()) {
                    try {
                        await _auth.SignupClass(_email, _password);
                      _globalKey.currentState.save();
                    }on FirebaseException catch (e) {
                      print(e.toString());
                      Scaffold.of(context).showSnackBar(
                        SnackBar(
                          content: Text(e.message),
                        ),
                      );
                    }
                  }
                }),
          ),
        ),
     )
      }
  
 
and I wrapped my main function with  Firebase Initialize

    void main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    runApp(MyApp());
    }

  

Ответ №1:

Вам нужно преобразовать ваш виджет в StatefulWidget и вызвать setState() для методов OnChanged ваших текстовых полей. Поскольку состояние виджета не обновляется до тех пор, пока не будет вызвана сборка, ваши поля _email, _password и _name никогда не будут обновлены. Это устранит вашу проблему, но есть лучшие способы сделать это.

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

  1. Блок
  2. Поставщик
  3. RxDart

На YouTube есть много руководств, которые вы можете проверить. Несколько, которые я рекомендую, от AndyJulow, ResoCoder и MarcusNg.

Комментарии:

1. Отлично!! Вы мне очень помогли… Большое спасибо @Scott