每个屏幕都应该在加载之前检查身份验证,还是应该只在 main.dart 文件中完成?



这可能是一个非常基本的问题,但我想了解整个行业遵循的最佳实践。

现在我正在main.dart文件的构建方法中执行此操作。

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: new StreamBuilder(
stream: auth.onAuthStateChanged,
builder: (context, snapshot)  {
if (snapshot.hasData) {
return MainScreen();
}
return AuthScreen();
},
),
);
}

我认为这种方法没有任何问题,我也使用类似的东西来重新启动我的应用程序,但是存在一个问题。 当您更改路线并获得授权时,它不会打开主屏幕(因为您不再在主页小部件中(

您可以尝试以下解决方案:

使用生成器:

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: MainScreen(),
builder: (context, widget) {
return StreamBuilder(
stream: auth.onAuthStateChanged,
builder: (context, snapshot)  {
if (snapshot.hasData) {
return widget;
}
return AuthScreen();
},
),
},
);
}

它解决了这个问题,但您的小部件中的数据可能由于取消身份验证而无效,所以我的建议是像这样重新启动应用程序:


double appKey = 0;
@overrdie
initState() {
super.initState();
auth.onAuthStateChanged.listen(() {
setState(() { appKey++; });
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
key: Key('$appKey'),
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: new StreamBuilder(
stream: auth.onAuthStateChanged,
builder: (context, snapshot)  {
if (snapshot.hasData) {
return MainScreen();
}
return AuthScreen();
},
),
);
}

但是,如果您确定处理无效数据,最好收听onAuthStateChanged(如上面的代码(并通过导航器推送AuthScreen并使用AuthScreen中的小部件阻止用户退出屏幕WillPopScope。由于过渡动画,感觉更好。

相关内容

最新更新