Невозможно выйти из Firebase в трепете

main.dart

import 'package:flutter/material.dart';
import 'package:app_name/screens/auth_screen.dart';
import 'package:app_name/screens/catalog_screen.dart';
import 'package:app_name/screens/grid_screen.dart';
import 'package:app_name/screens/outstanding.dart';
import './screens/cart_screen.dart';
import './screens/dispatch_screen.dart';
import './screens/payment_screen.dart';
import 'package:provider/provider.dart';
import 'package:firebase_auth/firebase_auth.dart';
import './provider/selection_type.dart';
import './screens/catalog_screen.dart';
import './screens/selection.dart';
import './provider/cart_provider.dart';
import './provider/products_provider.dart';

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

class MyApp extends StatelessWidget {
  static Map<int, Color> color = {
    50: Color.fromRGBO(136, 14, 79, .1),
    100: Color.fromRGBO(136, 14, 79, .2),
    200: Color.fromRGBO(136, 14, 79, .3),
    300: Color.fromRGBO(136, 14, 79, .4),
    400: Color.fromRGBO(136, 14, 79, .5),
    500: Color.fromRGBO(136, 14, 79, .6),
    600: Color.fromRGBO(136, 14, 79, .7),
    700: Color.fromRGBO(136, 14, 79, .8),
    800: Color.fromRGBO(136, 14, 79, .9),
    900: Color.fromRGBO(136, 14, 79, 1),
  };
  MaterialColor colorCustom = MaterialColor(0xFF415dc1, color);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider.value(
          value: Products(),
        ),
        ChangeNotifierProvider.value(
          value: SelectionProvider(),
        ),
        ChangeNotifierProvider.value(
          value: Cart(),
        ),
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Flutter Demo',
        theme: ThemeData(
            primarySwatch: colorCustom, bottomAppBarColor: colorCustom),
        home: StreamBuilder(
          stream: FirebaseAuth.instance.onAuthStateChanged,
          builder: (ctx, userSnapshot) {
            if (userSnapshot.hasData) {
              return Selection();
            }
            return AuthScreen();
          },
        ),
        routes: {
          GridScreen.routeName: (ctx) => GridScreen(),
          CatelogScreen.routeName: (ctx) => CatelogScreen(),
          DispatchScreen.routeName: (ctx) => DispatchScreen(),
          PaymentsScreen.routeName: (ctx) => PaymentsScreen(),
          CartScreen.routeName: (ctx) => CartScreen(),
          OutstandingScreen.routeName: (ctx) => OutstandingScreen(),
          AuthScreen.routeName: (ctx) => AuthScreen(),
        },
      ),
    );
  }
}

AuthScreen.dart:

import 'dart:io';
import '../widgets/auth_form.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/services.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class AuthScreen extends StatefulWidget {
    static final routeName = '/auth_screen';

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

class _AuthScreenState extends State<AuthScreen> {
  final _auth = FirebaseAuth.instance;
  var isLoading = false;
  void _submitAuthForm(
    String email,
    String password,
    String userName,
    File image,
    bool isLogin,
    BuildContext ctx,
  ) async {
    AuthResult authResult;
    try {
      setState(() {
        isLoading = true;
      });
      if (isLogin) {
        authResult = await _auth.signInWithEmailAndPassword(
          email: email,
          password: password,
        );
      } else {
        authResult = await _auth.createUserWithEmailAndPassword(
          email: email,
          password: password,
        );



        //files upload
        await Firestore.instance
            .collection('users')
            .document(authResult.user.uid)
            .setData({
          'userName': userName,
          'email': email,
        });
      }
    } on PlatformException catch (err) {
      var message = 'An error occured';
      if (err.message != null) {
        message = err.message;
      }
      Scaffold.of(ctx).showSnackBar(SnackBar(
        content: Text(message),
        backgroundColor: Theme.of(ctx).errorColor,
      ));
      setState(() {
        isLoading = false;
      });
    } catch (err) {
      print(err);
      setState(() {
        isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Theme.of(context).primaryColor,
      body: AuthForm(_submitAuthForm, isLoading),
    );
  }
}

это делает весь вход в систему, после этого пользователь входит на страницу выбора (seletion.dart), которая затем переходит на экран gridview.dart, где я использую FirebaseAuth.instance.signOut(); для выхода, но экран сетки все еще отображается на экране, хотя пользователь вышел из системы AuthScreen не отображается, похоже, steamBuilder не может прослушивать запрос на изменение от 2-го дочернего элемента в дереве виджетов, потому что, если я выхожу из системы на странице выбора (прямой дочерний элемент), пользователь выходит из системы и экран изменяется. Пожалуйста помоги .


person Akshat Jain    schedule 23.05.2020    source источник


Ответы (1)


Вы должны await событие signOut. Я бы также порекомендовал вам поместить его в Future.

Это могло выглядеть примерно так:

Future handleSignOut() async {
  try {
    return await FirebaseAuth.instance.signOut();
  }catch (e){
    return (e)
  }
}
person Mo711    schedule 23.05.2020
comment
Да, но id все равно нужно вернуться на экран, чтобы увидеть экран аутентификации. Мне все еще нужно добавить Navigator.pop(context); в код. - person Akshat Jain; 25.05.2020
comment
Да, сделайте это после того, как вы выполнили будущее - person Mo711; 26.05.2020