Flutter 有没有一种简单的方法可以让android后退按钮完全像应用程序栏上的后退按钮一样工作?

Flutter 有没有一种简单的方法可以让android后退按钮完全像应用程序栏上的后退按钮一样工作?,flutter,Flutter,我希望硬件后退按钮始终与我的应用程序栏后退按钮完全相同。我想让它出现在我所有的屏幕上。WillPopScope似乎不容易使用,因为我的appbar始终是WillPopScope的子级,因此我需要在许多不同的情况下将数据传递给父级 编辑(更多详细信息): 在我的应用程序的注册页面中,如果注册过程正在进行,我将使用IgnorePointer阻止用户与应用程序的交互,但这当然不适用于硬件后退按钮 我还根据注册页面的状态设计了appbar后退按钮。所以appbar后退按钮至少有3种情况。我希望所有应用到

我希望硬件后退按钮始终与我的应用程序栏后退按钮完全相同。我想让它出现在我所有的屏幕上。WillPopScope似乎不容易使用,因为我的appbar始终是WillPopScope的子级,因此我需要在许多不同的情况下将数据传递给父级

编辑(更多详细信息):

在我的应用程序的注册页面中,如果注册过程正在进行,我将使用IgnorePointer阻止用户与应用程序的交互,但这当然不适用于硬件后退按钮


我还根据注册页面的状态设计了appbar后退按钮。所以appbar后退按钮至少有3种情况。我希望所有应用到硬件返回按钮也。问题是我在一个子部件中,因此我不想为每种情况调用函数并更新父部件的状态。这没有用,而且做起来很痛苦。

如果我正确理解了你的问题,我有一些东西可能会帮助你。我已经在我的一个项目上实现了这段代码。但是,我使用了
Provider
Bloc
进行状态管理

注册页面。dart

@override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: _onWillPop,
      child: ChangeNotifierProvider<SignupProvider>(
        create: (context) => SignupProvider(),
        child: BlocProvider<SignupBloc>(
          create: (context) => _signupBloc,
          child: BlocListener<SignupBloc, SignupState>(
            listener: (context, state) {
              if (state is SignupCancelled) {
                _closeSignup();
              } else if (state is SignupSuccessful) {
                _closeSignup(delay: 1000);
              } else if (state is SignupInitial) {
                _returnToCredentials();
              } else if (state is SignupProceededToDetails) {
                _proceedToDetails();
              }
            },
            child: Scaffold(
              appBar: AppBar(
                title: const Text("Signup"),
              ),
              body: SafeArea(
                child: PageView(
                  controller: _pageController,
                  physics: const NeverScrollableScrollPhysics(),
                  children: <Widget>[
                    const SignupCredentialsForm(),
                    const SignupDetailsForm(),
                  ],
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

Future<bool> _onWillPop() async {
    int page = _pageController.page.toInt();

    _signupBloc.add(
      BackButtonPressed(page: page),
    );

    return false;
  }

  _closeSignup({int delay = 0}) async {
    await Future.delayed(Duration(milliseconds: delay));
    Navigator.of(context).pop();
  }

  _returnToCredentials() {
    _pageController.animateToPage(0,
        duration: const Duration(milliseconds: 250), curve: Curves.easeIn);
  }

  _proceedToDetails() {
    _pageController.animateToPage(1,
        duration: const Duration(milliseconds: 250), curve: Curves.easeIn);
  }
@覆盖
小部件构建(构建上下文){
返回式示波器(
onWillPop:_onWillPop,
子项:ChangeNotifierProvider(
创建:(上下文)=>SignupProvider(),
孩子:BlocProvider(
创建:(上下文)=>\u signupBloc,
孩子:布洛克斯腾纳(
侦听器:(上下文、状态){
如果(状态为已取消注册){
_特写签名();
}else if(状态为SignupSuccessful){
_特写注册(延迟:1000);
}else if(状态为SignupInitial){
_returnToCredentials();
}else if(状态为SignupProceedToDetails){
_proceedToDetails();
}
},
孩子:脚手架(
appBar:appBar(
标题:施工文本(“注册”),
),
正文:安全区(
子:页面视图(
控制器:_pageController,
物理学:const NeverScrollableScrollPhysics(),
儿童:[
const SignupCredentialsForm(),
const SignupDetailsForm(),
],
),
),
),
),
),
),
);
}
Future\u onWillPop()异步{
int page=_pageController.page.toInt();
_signupBloc.add(
按下BackButton(第页:第页),
);
返回false;
}
_closeSignup({int delay=0})异步{
等待未来。延迟(持续时间(毫秒:延迟));
Navigator.of(context.pop();
}
_返回公寓{
_pageController.animateToPage(0,
持续时间:常数持续时间(毫秒:250),曲线:Curves.easeIn);
}
_proceedToDetails(){
_pageController.animateToPage(1,
持续时间:常数持续时间(毫秒:250),曲线:Curves.easeIn);
}
如果你看我的代码,我有一个由2页组成的页面视图。PageView页面都使用AppBar,并在左上角包含“后退”按钮

通常,按appbar上的“后退”按钮或“硬件后退”按钮将关闭页面,并导航回上一页


但是,由于我有
WillPopScope
,在
signup\u页面上
,这被覆盖。因此,当按下后退按钮(appbar或硬件)时,我能够控制我想要发生的事情。您可以看到,我可以使用
\u proceedToDetails()
移动到下一个页面视图,或者使用
\u returnToRedentials()
返回到第一个表单,如果我在第一个表单中并且使用
\u closeSignup()
按下后退按钮,同样地,如果注册成功,即使在最后一张表单上也要关闭页面。

这是默认行为。只有在应用程序的顶部小部件上,您通常才需要使用WillPopScope来避免用户意外关闭应用程序,或者当您确实希望后退按钮的行为与导航中的后退不同时。你可能需要给我们更多的信息才能得到高质量的回复。我编辑了这个问题。我想我会使用,但我希望有一个更简单的方法。我希望它能帮助你解决你的问题。但要小心,不要过多地改变后退按钮的行为。Android用户习惯于让“后退”按钮按预期工作,但边缘情况除外,在这种情况下,您可以避免他们在表单、关闭视图或应用程序本身中意外丢失数据。