如果没有登录用户,我想导航到登录页面,否则显示主页。我想到了在build方法中有条件地调用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,
);
},
);
}
}
答案 0 :(得分:1)
如果您使用设置按钮,则需要在onTap中使用三元数;或者,如果只是希望它在应用程序启动时自动将用户发送到正确的页面,则可以将三元数放入MyApp中构建方法。
如果您正在使用设置按钮,并且只是想在未登录的情况下将其弹出回到上一页,则可以将NotLoggedIn()更改为弹出窗口。
出于某种奇怪的原因,SO拒绝按照正确的格式正确编码四个空格的代码,因此,我只想总结一下。
https://gist.github.com/ScottS2017/3288c7e7e9a014430e56dd6be4c259ab
答案 1 :(得分:0)
这就是我最终要这样做的方式。我使用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()
,也可以使用。只是将其发布在这里供后代使用。