Как сначала проверить, входит ли пользователь в систему или нет в firebase с помощью Flutter - PullRequest
0 голосов
/ 12 июля 2020

мой код:

  void initState() {
        super.initState();
        FirebaseAuth.instance.currentUser().then((user) => Navigator.push(context, MaterialPageRoute(builder: (context) => HomeScreen())));
      }

Вот мой initState, он на секунду показывает экран входа в систему, и я не хочу этого .. Решения приветствуются.

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Обычно для приложений, которые я создаю, я поддерживаю логическую переменную с именем «auth» в объекте пользователя и меняю ее на true, когда пользователь входит в систему.

И в идеале a "Spla sh Экран" с этим кодом.

if(user.auth)
{
  //User Authenticated
  Navigator.push(context, MaterialPageRoute(builder: (context) => HomeScreen())));

}else{

  //User not Authenticated
  Navigator.push(context, MaterialPageRoute(builder: (context) => LoginScreen())));
}

После аутентификации не забудьте сохранить объект пользователя или переменную аутентификации в локальном хранилище / Shared Настройки , чтобы данные не терялись после выхода пользователя из приложения.

Код для сохранения объекта пользователя:

SharedPreferences prefs = await SharedPreferences.getInstance();

prefs.setString("current_user",json.encode(user.toJson()));

Класс пользователя :

class User{
  final String username;
  final String email;

  //is user signed in?
  bool isAuth;


  User({this.username, this.email,this.isAuth});

  User.fromData(Map<String,dynamic> data)
  : username  = data['Username'],
    email     = data['email'],
    isAuth    = data['isAuth'] ?? false,


  Map<String,dynamic> toJson() {
    return {
      "Username" : username,
      "email"    : email,
      "isAuth"   : isAuth ?? false,
    };
  }

Дайте мне знать, если у вас возникнут дополнительные вопросы.

0 голосов
/ 12 июля 2020

Вы можете использовать аутентификацию Firebase, чтобы проверить, вошел ли пользователь в систему или нет. Сначала создайте экран spla sh:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  
  @override
  Widget build(BuildContext context) {
      return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Meet Up',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
        home: IntroScreen(),);

  }
}

В IntroScreen() StatefulWidget вы можете проверить, вошел ли пользователь в систему или нет, и перейти к указанной странице c:

class IntroScreen extends StatefulWidget{


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

class _IntroScreenState extends State<IntroScreen> {

  @override
  void initState() {
    super.initState();
    FirebaseAuth.instance.currentUser().then((res) {
      print(res);
      if (res != null) {
        Navigator.pushReplacement(
          context,
          MaterialPageRoute(builder: (context) => Home()),
        );
      }
      else
      {
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SignUp()),
        );
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return new SplashScreen(
        seconds: 5,
        title: new Text('Welcome To Meet up!',
          style: new TextStyle(
              fontWeight: FontWeight.bold,
              fontSize: 20.0
          ),),
        image: Image.asset('assets/images/dart.png',fit:BoxFit.scaleDown),
        backgroundColor: Colors.white,
        styleTextUnderTheLoader: new TextStyle(),
        photoSize: 100.0,
        onClick: ()=>print("flutter"),
        loaderColor: Colors.red
    );
  }
}

https://pub.dev/packages/splashscreen

...