如果没有登录用户,我想导航到登录页面,否则显示主页。我想过在构建方法内有条件地调用
Navigator.of(context).push()
但这会触发异常。我是否缺少一些可以覆盖的方法?
更新添加主页小部件
class HomePage extends StatelessWidget {
final AppUser user;
const HomePage({Key key, this.user}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Rera Farm'),
actions: <Widget>[
PopupMenuButton(
itemBuilder: (BuildContext context) {
return <PopupMenuEntry>[
PopupMenuItem(
child: ListTile(
title: Text('Settings'),
onTap: () {
Navigator.pop(context);
Navigator.push(context,
MaterialPageRoute(builder: (BuildContext context)
=> SettingsPage()
));
},
),
),
];
},
)
],
),
body: _buildBody(context));
}
还有容器
class HomePageContainer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new StoreConnector<AppState, _ViewModel>(
converter: _ViewModel.fromStore,
builder: (BuildContext context, _ViewModel vm) {
return HomePage(
user: vm.user,
);
},
);
}
}
如果您使用设置按钮,则需要在 onTap 中使用三元,或者,如果您只是希望它在应用程序启动时自动将用户发送到正确的页面,则可以将三元放在 MyApp 构建方法中.
如果您正在使用设置按钮,并且只想让它在未登录的情况下弹回到上一页,那么您可以将 NotLoggedIn() 更改为弹出。
出于某种奇怪的原因,当代码正确格式化为四个空格时,SO 拒绝发布代码,完全按照它的要求,所以我只想提出一个要点。
https://gist.github.com/ScottS2017/3288c7e7e9a014430e56dd6be4c259ab
这就是我最终的做法。我在
main
方法中进行检查,因此用户在进行这些奇怪的检查时会看到清单中设置的启动屏幕:
void main() {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences.getInstance().then((instance) {
_token = instance.getString("token");
final _loggedIn = _token != null && token != "";
runApp(MyApp(loggedIn: _loggedIn));
});
}
然后在您的应用程序中添加要切换的参数:
class MyApp extends StatelessWidget {
final bool loggedIn;
MyApp({this.key, this.loggedIn});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: loggedIn ? HomePage() : LoginPage(),
);
}
}
如果需要在 MyApp() 下面执行,也可以使用
Navigator.pushReplacement()
。只是为了后代发布在这里。
谢谢,这正是我所需要的。我可能会补充说我的登录页面
Navigator.pushReplacement(context, MaterialPageRoute(
builder: (context) => const HomePage(title: 'xxx'),
),);