Я использую систему аутентификации Firebase для входа и регистрации и Cloud Firestore в качестве базы данных.
Это поток FirebaseUser, который я использовал, чтобы определить, какой пользователь вошел в систему (поэтому мне не нужно снова входить в систему и снова каждый раз, когда я открываю приложение) и обнаруживаю изменения авторизации в случае выхода пользователя из системы:
Stream<FirebaseUser> get user{
return _auth.onAuthStateChanged;
}
Я добавил этот поток вверху дерева виджетов:
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return StreamProvider<FirebaseUser>.value(
value: FirebaseAPI().user,
child: ChangeNotifierProvider<SavedUser>(
create: (_) => SavedUser(),
child: MaterialApp(
home: Wrapper(),
),
),
);
}
}
[FirebaseAPI () - это класс, содержащий все функции FirebaseAuth, включая поток FirebaseUser.]
Теперь проблема, с которой я столкнулся, заключается в том, что после регистрации пользователя и перезапуска приложения .... .. Этот зарегистрированный пользователь автоматически входит в систему. Но я не хочу этого делать.
На самом деле мое приложение работает примерно так:
- Пользователь регистрируется. (Его зарегистрированные данные попадают в коллекцию «Ожидание» в базе данных).
Future<dynamic> sendUserRegistrationtoPending(String name,String email,String password,String branch)
{
return databaseReference.collection('Pending').document(name).setData(<String,dynamic>{
'Email' : email,
'Password' : password,
'Branch' : branch,
'Status' : 'user',
}).then((value){return "Success";});
}
[Нет взаимодействия с FirebaseAuth при отправке этого пользователя в «Ожидание»]
Затем админ получает карточку уведомления зарегистрированного пользователя. После принятия регистрации пользователь будет перемещен из коллекции «Ожидает» в «Пользователь», и, следовательно, пользователь станет действующим пользователем и сможет войти в систему.
Future<dynamic> registerUserFromPending(String name,String email,String password,String branch,String phone) async
{
AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
if(result == null)
print("Error is Firebase Auth while registering");
else{
databaseReference.collection('Pending').document(name).delete();
return databaseReference.collection('User').document(result.user.uid).setData(<String,dynamic>{
"Name" : name,
"Email" : email,
"Password" : password,
"Branch" : branch,
'Phone' : phone,
"Status" : 'user',
}).then((value){
return "Success";
}).catchError((a){
return a;
});
}
}
Здесь я Я использую функцию FirebaseAuth для регистрации пользователя в Firebase и предоставления UID пользователю, чтобы Firebase распознала его, как только пользователь войдет в систему.
Моя точка зрения ....... Скажем, я Мы с администратором приняли регистрацию пользователя. Тогда я не хочу входить в систему под этим идентификатором пользователя после того, как открою приложение.
Надеюсь, вы поняли суть моего вопроса.
Заранее большое спасибо за ответ. :)
Обновление:
В качестве временного исправления я сделал следующее:
Future<dynamic> registerUserFromPending(String adminEmail,String adminPassword,String name,String email,String password,String branch,String phone) async
{
String uid;
_auth.createUserWithEmailAndPassword(email: email, password: password).then((newUid){
if(newUid == null)
print("Error in Auth");
else{
uid = newUid.user.uid;
FirebaseAPI().loginWithEmailAndPassword(adminEmail, adminPassword).then((value){
print("Me : \n" + "Email ID : " + value.email);
databaseReference.collection('Pending').document(name).delete();
return databaseReference.collection('User').document(uid).setData(<String,dynamic>{
"Name" : name,
"Email" : email,
"Password" : password,
"Branch" : branch,
'Phone' : phone,
"Status" : 'user',
}).then((value){
return "Success";
}).catchError((a){
return a;
});
});
}
});
}
Здесь я повторно вхожу в админку после принятия регистрации нового пользователя ....... Но я не думаю, что это лучший способ сделать это. Пожалуйста, предложите лучший способ, если он есть.