代码之家  ›  专栏  ›  技术社区  ›  skjagini

颤振:按下后退按钮应允许应用程序进入后台

  •  1
  • skjagini  · 技术社区  · 5 年前

    我使用flutter BottomSheet来显示信息,并希望在单击后退按钮时始终保持BottomSheet可见,为了使其正常工作,我已经明确处理了onWillPop,并在用户单击后退按钮、更改路线等时保持BottomSheet在视图中。

    底部有一个200的高度,我想保持它,但允许应用程序进入背景状态时,后退按钮被单击。

    Widget _buildBody(context) => WillPopScope(
          onWillPop: () async {
            if(navigatorKey.currentState.canPop()) {
              navigatorKey.currentState.pop();
              return false;
            }else {
              // Returning true will remove the BottomSheet when back button is pressed, and if you press the back button one more time, the app will go to background state
              // return true;
            }
          },
          child: MaterialApp(
              navigatorKey: navigatorKey,
              onGenerateRoute: (route) => pagesRouteFactories[route.name]()));
    

    有什么想法吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Harsh Bhikadia    5 年前

    由于您只使用一个导航器,scaffold会将“底部板材”路线推送到与其他路线相同的导航器。所以不可能在两者之间插入东西。

    我建议用另一个导航器包裹脚手架(仅用于推/弹出底板)。现在您将拥有嵌套的导航器-一个位于MaterialApp级别,一个位于scaffold级别。从“应用程序”级别的导航器中弹出内容-这不会触及您的底页。一旦“应用程序”级导航器中没有任何内容,活动将关闭。

    这在我看来是可行的。

    More info on Nested Navigator

    编辑:代码

    @override
      Widget build(BuildContext context) {
        return WillPopScope(
          onWillPop: ()async{
            if(Navigator.of(context).canPop()) {
              Navigator.of(context).pop();
              return false;
            }
            return true;
          },
          child: Navigator(
            onGenerateRoute: (route) => MaterialPageRoute(
                  builder: (context) => Scaffold(...),
                ),
          ),
        );
      }