【问题标题】:How can I execute a function when a user hits the back button or swipes to close a screen in flutter?当用户点击后退按钮或滑动以关闭屏幕时,如何执行功能?
【发布时间】:2021-07-23 04:35:30
【问题描述】:

我想在屏幕关闭时始终执行一个功能,无论是当用户按下后退按钮还是滑动以关闭页面时。

我尝试的是使用WillPopScope

return WillPopScope(
      onWillPop: _onWillPop,
      child: CupertinoScaffold( ... the rest of my tree
  Future<bool> _onWillPop() async {
    myFunction();
    return true;
  }

虽然每当通过后退按钮关闭页面时这确实会成功执行我的功能,但它似乎已禁用滑动以返回 iOS。滑动以返回 android 似乎仍然有效。

还有其他方法可以让我在 iOS 上保留滑动返回功能吗?

编辑:

以防万一,myFunction() 涉及提供程序和上下文,当我尝试从 dispose 调用它时会引发错误。 实际上 myFunction() 是:

context.read(myVisibilityProvider).changeVisibility(false);

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我成功地运行了一个从 dispose 调用它的函数,并保留了 iOS 滑动到后退的手势。

    class ScrondScreen extends StatefulWidget {
      const ScrondScreen({Key? key}) : super(key: key);
    
      @override
      _ScrondScreenState createState() => _ScrondScreenState();
    }
    
    class _ScrondScreenState extends State<ScrondScreen> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(),
        );
      }
    
      void myFunction() {
        print('I run');
      }
    
      @override
      void dispose() {
        myFunction();
        super.dispose();
      }
    }
    

    控制台: flutter: I run

    【讨论】:

    • 我最初尝试过,但一直收到此错误The following assertion was thrown while finalizing the widget tree: Looking up a deactivated widget's ancestor is unsafe.。这可能与我的函数所做的有关使用上下文:context.read(myVisibilityProvider).changeVisibility(false);
    • 是的,从dispose 无法访问真正的上下文,即使mounted 检查也不起作用。
    • 好的,谢谢。我刚刚发现这个:github.com/flutter/flutter/issues/14203。看来我不是唯一一个有这个问题的人
    猜你喜欢
    • 2014-11-18
    • 2014-09-27
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多