如何在Flutter中加载时导航到另一页

时间:2018-11-27 01:37:36

标签: flutter

如果没有登录用户,我想导航到登录页面,否则显示主页。我想到了在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,
     );
   },
 );
 }
}

2 个答案:

答案 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(),也可以使用。只是将其发布在这里供后代使用。