如何在Flutter中添加事件监听器?

问题描述 投票:0回答:4

我对 Flutter 还很陌生,正在尝试使用 SDK。我正在开发一个简单的应用程序,该应用程序在后台有倒计时,并希望以一定的时间间隔触发事件。例如,当时钟剩余一分钟时,发送推送通知。一般来说,我试图了解如何监视某些活动,例如应用程序的时间和使用情况,以及一旦满足某些条件,就触发其他事情。是不是就像把 if-else 语句放在正确的位置那么简单?

我需要什么样的东西来实现这个?

提前致谢。

dart flutter
4个回答
7
投票

我更喜欢使用流来完成此类任务

Stream<int> timer = Stream.periodic(Duration(seconds: 1), (int count) => count);
...
_MyTextWidget(timer)

和我的小部件

class _MyTextWidget extends StatefulWidget {
  _MyTextWidget(this.stream);

  final Stream<int> stream;

  @override
  State<StatefulWidget> createState() => _MyTextWidgetState();
}

class _MyTextWidgetState extends State<_MyTextWidget> {
  int secondsToDisplay = 0;

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: widget.stream,
        builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
          return snapshot.hasData ? Text(snapshot.data.toString()) : Text('nodata');
        });
  }
}

6
投票

您可以使用 ValueNotifier 来实现此目的。

当值被替换为不等于由相等运算符评估的旧值时

==
,此类会通知其侦听器。

有用的中等链接


5
投票

以下是我发现可以工作的基于 Streams 的事件侦听器的更好示例。

在您想听的小部件中..

class CmVideoPlayer extends StatefulWidget {
  String titlePlaying;

  StreamController changeController = StreamController<VideoPlayerEvent>();

  CmVideoPlayer({Key key, @required this.titlePlaying})
      : assert(titlePlaying != null), super(key: key);

    @override
    _CmVideoPlayerState createState() => _CmVideoPlayerState();

}

参见“StreamController changeController = StreamController();”行它使用一个小类 VideoPlayerEvent 来携带消息。

class VideoPlayerEvent {
  var eventType;
  var eventMessage;

  VideoPlayerEvent(this.eventType, this.eventMessage);
}

然后在 STATEFULLWIDGET...

将流称为

class _CmVideoPlayerState extends State<CmVideoPlayer> {
    void Member() {
        widget.changeController.add(new VideoPlayerEvent('state', 'finished'));
    }
}

因为它位于 _CmVideoPlayerState 类内部,并且能够通过 widget 变量访问父类。

然后在使用小部件的代码区域中,并监听消息.. 收听消息

CmVideoPlayer myPlayer = CmVideoPlayer();
myPlayer.changeController.stream.listen((e) {
     print('Reciever event from CmVideoPlayer: ' + e.eventMessage.toString());
}

应该可以了。 然而,这一次只允许一名听众。 完成这件事后,我继续前进。 但计划在后续实现多侦听器。

也许有人可以对此进行扩展。 我尽可能保持简单。 如果有人有一个多听众的例子。 请在这里发帖。


0
投票

检查这个包:event_handeler

这个 flutter 包为您提供了直观的方法,就像 JavaScript 事件 API 一样。对于分派自定义事件,我们假设当我向

secureStorage

添加某些内容时
_storage.write(key: 'filterBy', value: "clear filters").then((value) {
dispatchCustomEvent("clear filters","filterChange");
});

要监听此特定事件,请将其放入任意函数下的

initState
中:

addCustomEventListener("filterChange", (eventvalue){
print(eventvalue);//prints clear filters
//do something you want when the event happens
    
});

方法

  • dispatchCustomEvent(eventvalue,eventType)
  • addCustomEventListener(eventType, callback)

回调具有 eventvalue

的值
© www.soinside.com 2019 - 2024. All rights reserved.