Reputation: 13
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),
);
}
}
this makes the whole login,
after that the user login the selection page(seletion.dart) which then moves to the gridview.dart screen where i use
FirebaseAuth.instance.signOut();
to signout but the gridscreen still appears on the screen,although the user is logged out the AuthScreen is not being shown ,
looks like the steamBuilder cannot listen to request change from 2nd child in the widget tree because if i logout in selection page(direct child) the user is logged out and the screen changes.
Please Help .
Upvotes: 1
Views: 253
Reputation: 639
You have to await
the signOut
Event. I would also recommend you putting it into a Future
.
It could look something like that:
Future handleSignOut() async {
try {
return await FirebaseAuth.instance.signOut();
}catch (e){
return (e)
}
}
Upvotes: 2