用户是否登录均无关紧要,它会转到主页。 如果我每次重新启动应用程序时都将登录页面设为主页,则需要再次登录。
我希望它像登录一次然后登录直到注销为止
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MaterialApp(
debugShowCheckedModeBanner: false,
home: await getLandingPage(),
routes: {
'upload': (context) => ItemInput(),
'suzuki': (context) => Suzuki(),
'others': (context) => Others(),
},
));
}
Future<Widget> getLandingPage() async {
final FirebaseAuth _auth = FirebaseAuth.instance;
return StreamBuilder<User>(
stream: _auth.authStateChanges(),
builder: (BuildContext context, snapshot) {
if (snapshot.hasData && (!snapshot.data.isAnonymous)) {
return MainPage();
}
return LoginPage();
},
);
}
答案 0 :(得分:2)
启动应用程序后,Firebase会自动恢复用户的身份验证状态。这可能需要一些时间,因为它需要与服务器一起检查该帐户是否仍处于活动状态。
在此期间,该用户尚未登录,因此authStateChanges()
会触发null
。那就是您的代码将用户重定向到登录页面的时候。
您将需要等待片刻,以查看用户状态 是否已恢复,或者将导航逻辑移动/复制到登录页面,以便将其重定向到主页。一旦用户身份验证状态恢复。
答案 1 :(得分:1)
根据文档:
A流异步数据事件的源。 流提供了一种接收事件序列的方式。每个事件要么是数据事件(也称为流的元素),要么是错误事件(错误事件),该事件是发生故障的通知。当流发出所有事件后,一个“完成”事件将通知侦听器已到达末尾。
由于authStateChanges()
返回了Stream
,因此您可以使用StreamBuilder
来获取结果并相应地显示小部件。
根据StreamBuilder
文档:
例如,当与产生整数0到9的流进行交互时,可以使用以下快照的任何有序子序列(包括最后一个快照(带有ConnectionState.done的快照))调用生成器:>
因此,用于异步操作的类型AsyncWidgetBuilder
的builder
将根据Stream
的状态调用您的小部件,例如:
@override
Widget build(BuildContext context) {
final FirebaseAuth _auth = FirebaseAuth.instance;
return new Scaffold(
body: StreamBuilder(
stream: _auth.authStateChanges(),
builder: (context, AsyncSnapshot<FirebaseUser> snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
if (snapshot.hasData)
return MainPage();
else
return LoginPage();
} else
return Center(
child: CircularProgressIndicator(),
);
}));
}
您可以在启动屏幕中使用以上代码,在此Stream
处于等待状态,它将首先显示加载,然后在检索数据时(如果为null或有一个用户登录,它将进入active
状态并返回一个满足条件的小部件。
https://api.flutter.dev/flutter/widgets/AsyncWidgetBuilder.html
https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html
https://api.flutter.dev/flutter/widgets/StreamBuilder/builder.html
与OP交谈后。他们正在使用以下插件google_sign_in
,并拥有一个带有以下代码的auth.dart
文件:
void signOutGoogle() async {
await googleSignIn.signOut();
}
在这种情况下,发生的情况是该用户从Google auth退出,但仍在Firebase中登录,因此,您可以添加以下内容:
void signOutGoogle() async {
await googleSignIn.signOut();
await _auth.signOut();
}
答案 2 :(得分:1)
根据弗兰克的回答,这是解决如何使用import {Elements} from '@stripe/react-stripe-js';
import {loadStripe} from '@stripe/stripe-js';
const stripePromise = loadStripe('pk_test_123');
const App = () => {
return (
<Elements stripe={stripePromise}>
<PaymentComponentWithCardElementEtc />
</Elements>
);
};
小部件在第一个1
1
1
1
1
1 1
1 1 1 1
事件上收到$ sed 's/foo/oog/g;'
ffoo
foog
的问题。
oogg
}
如果您不想使用switch语句,则只能检查null
authStateChanges()