【问题标题】:How to prevent android device back button from going back to splash screen in flutter?如何防止android设备后退按钮在颤动中回到启动画面?
【发布时间】:2021-02-16 22:11:06
【问题描述】:

我为我的应用制作了一个徽标屏幕,将用户重定向到适当的位置(如果用户已登录,则为主屏幕,如果未登录,则为欢迎/启动屏幕)。到达主屏幕后,我可以通过按 Android 手机上的后退按钮返回上一个屏幕。我想阻止用户返回徽标屏幕。

我尝试过的事情:

WillPopScope() 与 onWillPop 返回 false

我的徽标屏幕代码:

class LogoScreen extends StatefulWidget {
  @override
  _LogoScreenState createState() => _LogoScreenState();
}

class _LogoScreenState extends State<LogoScreen> {
  var preferences;
  @override
  void initState() {
    super.initState();
    startTimer();
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async => false,
      child: Scaffold(
        backgroundColor: Colors.white,
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Image.asset(
                "assets/images/g1177.png",
                scale: 10.0,
              ),
            ],
          ),
        ),
      ),
    );
  }

  startTimer() {
    var _duration = Duration(milliseconds: 2000);
    return Timer(_duration, navigate);
  }

  navigate() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    if (preferences.getBool("is_logged_in") == true) {
      Navigator.push(context, MaterialPageRoute(builder: (context) {
        return HomeScreen();
      }));
    } else {
      Navigator.push(context, MaterialPageRoute(builder: (context) {
        return SplashScreen();
      }));
    }
  }
}

为什么这种方法在我的设备上不起作用?

【问题讨论】:

    标签: android flutter


    【解决方案1】:

    使用.pushReplacement(...) 而不是.push(...)

    pushReplacement 替换当前包围最紧的导航器路由 通过推送给定的路线然后处置给定的上下文 新路线完成动画后的上一条路线。

    【讨论】:

    • 非常感谢您的回复!不过,我已经找到了答案。我正在使用将在徽标屏幕上弹出屏幕,但如果我在主屏幕本身上使用它,那么它就可以工作。因此,如果您申请将在屏幕上弹出范围,那么您将无法从该屏幕弹出。谢谢!
    • 但这并不是最好的解决方案,因为闪屏会停留在堆栈中,你无法导航回它,所以最好用新屏幕替换它而不是 push new屏幕在它上面。
    • 哦,好的,谢谢!你的方法是对的,非常感谢
    【解决方案2】:

    我想通了。如果我在徽标屏幕上应用WillPopScope(),那么当我在徽标屏幕上时,如果我按下后退按钮,那么我无法从该屏幕进一步返回。因此,如果我在主屏幕上使用WillPopScope,那么我无法使用该屏幕上的后退按钮。这是我的主屏幕构建方法:

    @override
      Widget build(BuildContext context) {
        return WillPopScope(
          onWillPop: () async {
            return false;
          },
          child: Scaffold(
    
           //add your UI here like your appBar, body, bottomNavBar etc..
    
          )  //Scaffold
    
        );  //WillPopScope
    

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2012-04-18
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多