J'utilise Flutter pour créer un formulaire d'inscription à l'aide de l'authentification Firebase, mais ce message continue de s'afficher lorsque j'essaie de gérer l'authentification tout en essayant de montrer à l'utilisateur le message d'erreur d'inscription à l'aide du widget Scaffold.of(context).showSnackBar SnackBar(content: Text(e.message)à l'inscription

J'ai d'abord créé un fichier auth.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);
}

Ensuite, j'ai créé cette classe TextField pour modulariser mon code

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
    }}

Et Ceci est le widget d'inscription

  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());
    }

0
عبدالله لبيب 6 sept. 2020 à 13:22

1 réponse

Meilleure réponse

Vous devrez convertir votre widget en StatefulWidget et appeler setState() sur les méthodes onChanged de vos champs de texte. Comme l'état du widget n'est pas mis à jour tant qu'un build n'est pas appelé, vos champs _email, _password et _name ne seront jamais mis à jour. Cela résoudra votre problème, mais il existe de meilleures façons de le faire.

Il existe de nombreuses bibliothèques de gestion d'état qui aident grandement à conserver ce type d'état en dehors de l'interface utilisateur (généralement, il est préférable de séparer tout état non-UI de l'interface utilisateur). Voici quelques recommandations :

  1. Bloc
  2. Fournisseuse
  3. RxDart

Il existe de nombreux tutoriels sur YouTube que vous pouvez consulter. Quelques-uns que je recommande sont d'AndyJulow, ResoCoder et MarcusNg.

0
Scott Godfrey 6 sept. 2020 à 10:42