Не удалось вернуться к странице / экрану входа после выхода из системы (не уверен, что выход выполнен успешно или нет) - PullRequest
0 голосов
/ 25 февраля 2020

Я новичок во флаттере и имею дело с бэкэндом. У меня возникла проблема при выходе из системы, и я не знаю, как это исправить из-за недостатка опыта. Когда я выйду из системы, она не вернется к экрану входа (Аутентификация). Я не совсем уверен, заключается ли проблема в функции, которую я написал в оболочке или где-то в аутентификации. Виджет оболочки будет выполняться при каждом запуске приложения:

void main(){
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<User>.value(
      value: AuthService().user,
      child: new MaterialApp(
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
          primaryColor: Colors.redAccent,
        ),
        home: Wrapper(),
      ),
    );
  }
}

Код оболочки указан ниже:

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);
    print(user);

    if (user == null) {
      return Authenticate();
    } else {
      return MyBottomNavigationBar();
    }
  }
}

Функция кнопки выхода:

onPressed: () async {
              await _auth.signOut();
              print('signing out');
            },

Код авторизации:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:mudah_replica/models/user.dart';

class AuthService {

  final FirebaseAuth _auth = FirebaseAuth.instance;

  //Create user object based on FirebaseUser
  User _userFromFirebaseUser(FirebaseUser user){
    return user != null ? User(uid: user.uid) : null;
  }

  //Auth change user stream
  Stream<User> get user {
    return _auth.onAuthStateChanged
        //.map((FirebaseUser user) => _userFromFirebaseUser(user));
        .map(_userFromFirebaseUser);
  }

  //Sign in anonymously
  Future signInAnon() async {
    try {
      AuthResult result = await _auth.signInAnonymously();
      FirebaseUser user = result.user;
      return user;
    } catch(e) {
      print(e.toString());
      return null;
    }
  }

  //Sign in with Email & Password
  Future signInWithEmailAndPassword(String email, String password) async {
    try {
      AuthResult result = await _auth.signInWithEmailAndPassword(email: email, password: password);
      FirebaseUser user = result.user;
      return _userFromFirebaseUser(user);

    } catch(e){
      print(e.toString());
      return null;
    }
  }


  //Register with Email & Password
  Future registerWithEmailAndPassword(String email, String password) async {
    try {
      AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
      FirebaseUser user = result.user;
      return _userFromFirebaseUser(user);

    } catch(e){
      print(e.toString());
      return null;
    }
  }

  //Sign out
  Future signOut() async {
    try{
      return await _auth.signOut();
    } catch(e){
      print('Fail to sign out');
      print(e.toString());
      return null;
    }
  }
}

1 Ответ

0 голосов
/ 25 февраля 2020

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

onPressed: () async {
          await _auth.signOut();
          Navigator.push(context,
              MaterialPageRoute(builder: (context) => Authenticate())
        },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...