Невозможно обновить данные в базе данных Firebase при использовании проверки подлинности телефона во Flutter - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь добавить данные формы регистрации пользователя в базу данных firebase. Но трудно сделать это эффективно. Я новичок в трепетании. Я успешно зарегистрировал пользователя по номеру телефона, но не могу добавить соответствующие данные. Я пытался использовать геттер и сеттер, но он, очевидно, не работает. Я не знаю, что такое идеальный метод. Я пытался погуглить, но мне не помогли. Я просто застрял. Я буду очень признателен.

Вот мой код

import 'package:firebase_auth/firebase_auth.dart';
import 'package:home_crisp/models/user.dart';
import 'package:home_crisp/services/auth.dart';
import 'package:provider/provider.dart';


class ChefRegisterScreen extends StatefulWidget {
  ChefRegisterScreen();

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

class _ChefRegisterScreenState extends State<ChefRegisterScreen> {
  final AuthService _auth = AuthService();

  bool loading = false;
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  String chefName = "", phoneNo = "";
  String smsCode, verificationID;
  String phnCode = "+92";
  DateTime dateOfBirth;
  bool codeSent = false;
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);
    final deviceSize = MediaQuery.of(context).size;
    return loading
        ? Loading()
        : Material(
            type: MaterialType.card,
            color: Color(0xffD4EBD3),
            child: Stack(
              children: <Widget>[

            // --> Here is the code of getting "chefname, phone and dateOfBirth" and setting them using setState() method 

                              //
                              // >>>>>>>>> Textfeild for getting OTP code 
                              //

                              codeSent
                                  ? // Here is the code for textfeild which get OTP code
                                  : Container(),

// ------------------------------------------------------   F I N I S H    B U T T O N

                              FlatButton(
                                onPressed: () async {



                                    if (user != null) {
                                      print(
                                          "TheRe IS  uSer already logging in so signing out logging in new user");
                                      AuthService().signOut();
                                    }

                                    if (codeSent) {
                                      AuthService().signInWithOTP(smsCode, verificationID);
                                    } else {
                                      verifyPhone(phoneNo);
                                    }

// ----> Here I tried to several methods to sent register form data to the seperate class named 
// ----> "user.dart" from where I tried to extract that info in "auth" signinWithPhoneNumber method.
// ----> I first tried to send the info via constructor

                                  ChefData(chefName: chefName,
                                          chefPhNo: phoneNo,
                                          chefDateOfBirth: dateOfBirth);
                                    }); 
// ----> Then I tried "setter" but in vain
                                    // ChefData().setChefName(chefName);
                                    // ChefData().setChefPhNo(phoneNo);
                                    // ChefData().setChefDateOfBirth(dateOfBirth);

                                child: ClipRRect(
                                  child: Text(
                                        "FINISH",
                                        style: TextStyle(
                                          color: Colors.white,
                                          fontFamily: 'Montserrat',
                                          fontSize: 20,
                                        ),
                                      ),
                                ),
                              ),



                            ],
                          ),
                        ),
                      )
                    ],
                  ),
                ),
              ],
            ),
          );
  }

  //
  // >>>>>>>>> S I G N   I N   W I T H   P H O M E  N U M B E R   P R O C E S S
  //
  Future<void> verifyPhone(phoneNo) async {
    final PhoneVerificationCompleted verificationComplete =
        (AuthCredential authResult) {
      print('1. Auto retrieving verification code');

      }
    };

    final PhoneCodeAutoRetrievalTimeout autoRetrieve = (String verID) {
      verificationID = verID;
      print("\n2. Auto retrieval time out");
    };

    final PhoneCodeSent smsCodeSent =
        (String verID, [int forceCodeResend]) async {
      verificationID = verID;
      setState(() {
        this.codeSent = true;
      });
      print("\n 3. Code Sent to " + phoneNo);
    };

    final PhoneVerificationFailed verificationFailed =
        (AuthException authException) {
      print('${AuthException(smsCode, "message")}');
      if (authException.message.contains('not authorized'))
        print('App not authroized');
      else if (authException.message.contains('Network'))
        print('Please check your internet connection and try again');
      else
        print('Something has gone wrong, please try later ' +
            authException.message);
    };

    await FirebaseAuth.instance
        .verifyPhoneNumber(
          phoneNumber: phoneNo,
          timeout: Duration(seconds: 50),
          verificationCompleted: verificationComplete,
          verificationFailed: verificationFailed,
          codeSent: smsCodeSent,
          codeAutoRetrievalTimeout: autoRetrieve,
        )
        .then((value) {})
        .catchError((error) {
      print(error.toString());
    });
  }
}

Вот класс "auth.dart"

import 'package:firebase_auth/firebase_auth.dart';
import 'package:home_crisp/models/user.dart';
import 'package:home_crisp/services/database.dart';

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  // create user obj based on FirebaseUser

  User _userFormFirebaseUser(FirebaseUser user) {
    return user != null ? User(uid: user.uid) : null;
  }

  // auth change user stream
  Stream<User> get user {
    return _auth.onAuthStateChanged.map(_userFormFirebaseUser);
  }

  // ------------------------------------------------------ S I G N   I N   W I T H   P H O M E  N U M B E R

  signInWithPhoneNumber(AuthCredential authCreds) async {
    try {
      AuthResult result = await _auth.signInWithCredential(authCreds);
      FirebaseUser user = result.user;

      if (user != null) {
        print('AUTHENTICATONI SUCCESSFULL. Id: ' + user.uid);

// ---->> Now here I tried create a new document for the chef with the uid by extracting the chef data // // ---->> from "user.dart" class 

// ---->> I used getter method. I know there is going to be some better way to get that data

await DatabaseService(uid: user.uid).updateChefData(
            ChefData().getChefName(),
            ChefData().getChefPhNo(),
            ChefData().getChefDateOfBirth());

        return _userFormFirebaseUser(user);
      } else {
        print('Invalid code/invalid authentication');
      }
    } catch (e) {
      print(e.toString());
      return null;
    }
  }

  signInWithOTP(smsCode, verId) {
    AuthCredential authCreds = PhoneAuthProvider.getCredential(
        verificationId: verId, smsCode: smsCode);
    signInWithPhoneNumber(authCreds);
  }
}

Вот "user.dart" файл, содержащий класс «ChefData», выступающий в качестве посредника между «auth.dart» и «chefRegisterScreen.dart»

class User {

final String uid;
  User({this.uid});
}


class ChefData {
  String chefId;
  String chefName;
  String chefPhNo;
  DateTime chefDateOfBirth;

  ChefData({this.chefId, this.chefName, this.chefPhNo, this.chefDateOfBirth});

  // void setChefId(String _chefId) {
  //   this.chefId = _chefId;
  // }

  // void setChefName(String _chefName) {
  //   this.chefName = _chefName;
  // }

  // void setChefPhNo(String _chefPhNo) {
  //   this.chefPhNo = chefPhNo;
  // }

  // DateTime setChefDateOfBirth(DateTime _chefDateOfBirth) {
  //   this.chefDateOfBirth = _chefDateOfBirth;
  // }

  String getChefId() {
    return chefId;
  }

  String getChefName() {
    return chefName;
  }

  String getChefPhNo() {
    return chefPhNo;
  }

  DateTime getChefDateOfBirth() {
    return chefDateOfBirth;
  }
}
...