在Flutter中无活动超时后如何调用方法?

时间:2019-06-12 03:01:29

标签: user-interface flutter triggers timeout flutter-layout

实现以下功能的最佳方法是什么?

自从用户上一次与应用进行互动以来,等待了指定的时间(由常量变量定义)后,将自动调用一个函数以将几个小部件添加到页面。

1 个答案:

答案 0 :(得分:1)

我还没有真正尝试过这种方法,但是根据我的经验,我已经开始研究颤动了,

我想说,您可以在小部件树的顶部创建一个手势检测器,该手势检测器将在用户点击屏幕时捕获。

例如,您可以记录带有时间戳的int并在继承的小部件内更新此值(可能必须在手势检测器的顶部)

最后,小部件需要收听的地方都可以有一个计时器,该计时器每x的时间检查一次时间,并比较触摸是否在1到10秒之前完成。

继承的小部件可能像这样:

class MyInherited extends StatefulWidget {
  static MyInheritedData of(BuildContext context) =>
      context.inheritFromWidgetOfExactType(MyInheritedData) as MyInheritedData;

  const MyInherited({Key key, this.child}) : super(key: key);

  final Widget child;

  @override
  _MyInheritedState createState() => _MyInheritedState();
}
class _MyInheritedState extends State<MyInherited> {
  String myField;

  void onMyFieldChange(String newValue) {
      myField = newValue;
  }

  @override
  Widget build(BuildContext context) {
    return MyInheritedData(
      myField: myField,
      onMyFieldChange: onMyFieldChange,
      child: widget.child,
    );
  }
}

class MyInheritedData extends InheritedWidget {
  final String myField;
  final ValueChanged<String> onMyFieldChange;

  MyInheritedData({
    Key key,
    this.myField,
    this.onMyFieldChange,
    Widget child,
  }) : super(key: key, child: child);

  @override
  bool updateShouldNotify(MyInheritedData oldWidget) {
    return oldWidget.myField != myField ||
        oldWidget.onMyFieldChange != onMyFieldChange;
  }
}

小部件树的顶部看起来像这样:

GestureDetector(
  onTap: (){
    // Update the value of your field
  }

最后,每当您需要收听此更改时,都可以添加一个计时器,如下所示:

  Timer timer;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      timer = Timer.periodic(Duration(seconds: 10), (Timer t) {
        // Get your inherited widget here and check the value, compare it and act as you pleased
      });
    });
  }

  @override
  void dispose() {
    timer?.cancel();
    super.dispose();
  }

我知道这可能不是一个完美的例子,但希望可以将您带到正确的道路上!我没有时间做出更可靠的回答,但想提出自己的观点。

当我从他的回复Flutter: How to correctly use an Inherited Widget?中获取继承的小部件示例时,此问题的正确答案的作者将得到此信用。