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

问题描述 投票:0回答:3

如果没有登录用户,我想导航到登录页面,否则显示主页。我想过在构建方法内有条件地调用

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,
     );
   },
 );
 }
}
flutter
3个回答
3
投票

如果您使用设置按钮,则需要在 onTap 中使用三元,或者,如果您只是希望它在应用程序启动时自动将用户发送到正确的页面,则可以将三元放在 MyApp 构建方法中.

如果您正在使用设置按钮,并且只想让它在未登录的情况下弹回到上一页,那么您可以将 NotLoggedIn() 更改为弹出。

出于某种奇怪的原因,当代码正确格式化为四个空格时,SO 拒绝发布代码,完全按照它的要求,所以我只想提出一个要点。

https://gist.github.com/ScottS2017/3288c7e7e9a014430e56dd6be4c259ab


1
投票

这就是我最终的做法。我在

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()
。只是为了后代发布在这里。


0
投票

谢谢,这正是我所需要的。我可能会补充说我的登录页面

  • 使用共享首选项将登录数据返回到主页
  • 结束于
Navigator.pushReplacement(context, MaterialPageRoute(
    builder: (context) => const HomePage(title: 'xxx'),
),);
© www.soinside.com 2019 - 2024. All rights reserved.