Flutter Widget 之NotificationListener

463 阅读1分钟

你知道有些widget的作用是分发通知(notification)吗? 举例子,像是ListView这类,包含Scrollable的滚动Widget会分发ScrollNotification

通知会向上沿树状结构传递并调用visitor()方法检查每个祖先(ancestor)节点,除非中途被拦截回调

如果你使用的widget内含Scrollable这种widget,但widget不使用expose回调,你可能就得处理通知

child: SomeWidget(
    //Uses a Scrollable
),

这样的话,要如何监听那些通知? 用NotificationListener来监听通知,挑个有分发通知功能的widget再议Wrap(NotificationListener)

child: NotificationListener(
    child: SomeWidget(),
),

通知发送不一定得往父节点,只要有个祖先(ancestor)节点就行

child: NotificationListener(
    child: Container(
        child: SomeWidget(),
    ),
),

接着使用泛型(Generic)参数指定你要哦处理的通知类型

child: NotificationListener<ScrollNotification>(
    child: SomeWidget(),
)

最后,再加入回调方法onNotification, 返回值若是true,表示通知讯息被拦截,向上传递就会终止

child: NotificationListener<ScrollNotification>(
    onNotification: (notification) {
        print('$notification');
        return true;
    },
    child: SomeWidget(),
),

你也可扩展Notification的类来发送自定义通知

class MyNotification extends Notification {}

RaisedButton(
    child: Text('Option A'),
    onPressed: (){
        MyNotification('A was selected!').dispatch(context);
    }
),

如果想了解有关NotificationListenerr的内容,或者关于Flutter的其他功能,请访问flutter.dev

原文翻译自视频:视频地址