Flutter事件通知管理插件typed_event_notifier的使用
Flutter事件通知管理插件typed_event_notifier的使用
安装
在pubspec.yaml
文件中添加依赖:
dependencies:
typed_event_notifier: ... // 最新版本号
使用
查看/example
文件夹中的示例代码。
示例代码
import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:typed_event_notifier/typed_event_notifier.dart';
void main() {
runApp(const App());
}
/// 示例应用。
class App extends StatelessWidget {
/// 创建 [App] 实例。
const App({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(
title: '事件通知器演示',
notifier: notifier,
),
);
}
}
/*
示例事件,将通过通知器发送。
它们有一个抽象基类(用作父类型),
并从该基类扩展出不同内容的事件。
*/
/// 类 [Event]。
abstract class Event {
/// 创建 [Event] 实例。
Event();
}
/// 类 [CurrentPageChangedEvent]。
class CurrentPageChangedEvent extends Event {
/// 当前页面的索引。
final int currentPage;
/// 创建 [CurrentPageChangedEvent] 实例。
CurrentPageChangedEvent({
required this.currentPage,
}) : super();
}
/// 类 [PagesLoadedEvent]。
class PagesLoadedEvent extends Event {
/// 已加载页面的索引。
final Set<int> pages;
/// 创建 [PagesLoadedEvent] 实例。
PagesLoadedEvent({
required this.pages,
}) : super();
}
/*
示例通知器。
它可以向监听者发送对象的通知,
并且通知监听者,如果他们注册了此对象类型或扩展对象。
*/
/// 示例通知器实例。
final ExampleNotifier notifier = ExampleNotifier();
/// 类 [ExampleNotifier]。
class ExampleNotifier extends TypedEventNotifier<Event> {
/// 创建 [ExampleNotifier] 实例。
ExampleNotifier();
int _currentPage = 0;
/// 当前页面的索引。
int get currentPage => _currentPage;
set currentPage(int index) {
_currentPage = index;
notifyListeners(CurrentPageChangedEvent(currentPage: currentPage));
}
final Set<int> _loadedPages = {};
/// 已加载页面的列表。
List<int> get loadedPages => _loadedPages.toList(growable: false);
set loadedPages(List<int> list) {
final Set<int> loadedPages = list.toSet();
_loadedPages.addAll(loadedPages);
notifyListeners(PagesLoadedEvent(pages: loadedPages));
}
}
/*
仅监听 "当前页面更改" 事件的示例。
*/
/// 类 [CurrentPageOnlyListener]。
class CurrentPageOnlyListener extends StatefulWidget {
/// 创建 [CurrentPageOnlyListener] 实例。
const CurrentPageOnlyListener({
required this.notifier,
Key? key,
}) : super(key: key);
/// 通知器。
final ExampleNotifier notifier;
[@override](/user/override)
State<CurrentPageOnlyListener> createState() => _CurrentPageOnlyListenerState();
}
class _CurrentPageOnlyListenerState extends State<CurrentPageOnlyListener> {
String message = 'CurrentPageOnly: 空';
void currentPageChanged(CurrentPageChangedEvent event) {
setState(() {
message = 'CurrentPageOnly: 当前页面现在是 ${event.currentPage}';
});
}
[@override](/user/override)
void initState() {
widget.notifier.addListener(currentPageChanged);
super.initState();
}
[@override](/user/override)
void dispose() {
widget.notifier.removeListener(currentPageChanged);
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Text(message);
}
}
/*
监听所有事件的示例。
*/
/// 类 [AnyListener]。
class AnyListener extends StatefulWidget {
/// 创建 [AnyListener] 实例。
const AnyListener({
required this.notifier,
Key? key,
}) : super(key: key);
/// 通知器。
final ExampleNotifier notifier;
[@override](/user/override)
State<AnyListener> createState() => _AnyListenerState();
}
class _AnyListenerState extends State<AnyListener> {
String message = 'Any: 空';
void any(Event event) {
if (event is CurrentPageChangedEvent) {
setState(() {
message = 'Any: 当前页面现在是 ${event.currentPage}';
});
}
if (event is PagesLoadedEvent) {
setState(() {
message = 'Any: 新加载的页面是 ${event.pages}';
});
}
}
[@override](/user/override)
void initState() {
widget.notifier.addListener(any);
super.initState();
}
[@override](/user/override)
void dispose() {
widget.notifier.removeListener(any);
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Text(message);
}
}
/// 类 [MyHomePage]。
class MyHomePage extends StatelessWidget {
/// 创建 [MyHomePage] 实例。
const MyHomePage({
required this.title,
required this.notifier,
Key? key,
}) : super(key: key);
/// 主页标题。
final String title;
/// 通知器。
final ExampleNotifier notifier;
void _setNewCurrentPage() {
final Random random = Random();
notifier.currentPage = random.nextInt(100);
}
void _setNewLoadedPages() {
final Random random = Random();
notifier.loadedPages = [
random.nextInt(100),
random.nextInt(100),
random.nextInt(100)
];
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CurrentPageOnlyListener(notifier: notifier),
const SizedBox(height: 10),
AnyListener(notifier: notifier),
const SizedBox(height: 40),
const Text(
'您可以点击按钮来通知监听者。',
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _setNewCurrentPage,
child: const Text('新当前页面'),
),
const SizedBox(height: 10),
ElevatedButton(
onPressed: _setNewLoadedPages,
child: const Text('新加载的页面列表'),
),
],
),
),
);
}
}
更多关于Flutter事件通知管理插件typed_event_notifier的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter事件通知管理插件typed_event_notifier的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
typed_event_notifier
是一个用于 Flutter 的事件通知管理插件,它允许你在应用中轻松地发布和订阅事件。这个插件特别适用于需要在不同组件或服务之间进行通信的场景。
安装
首先,你需要在 pubspec.yaml
文件中添加 typed_event_notifier
依赖:
dependencies:
flutter:
sdk: flutter
typed_event_notifier: ^1.0.0
然后运行 flutter pub get
来安装依赖。
基本用法
1. 创建事件类型
typed_event_notifier
要求你为事件定义一个类型。你可以使用 TypedEvent
类来创建自定义事件类型。
import 'package:typed_event_notifier/typed_event_notifier.dart';
class MyEvent extends TypedEvent {
final String message;
MyEvent(this.message);
}
2. 创建事件通知器
你可以使用 TypedEventNotifier
来创建一个事件通知器。这个通知器将负责发布事件和订阅事件。
final eventNotifier = TypedEventNotifier<MyEvent>();
3. 订阅事件
你可以通过 addListener
方法来订阅事件。当事件发布时,监听器会被调用。
eventNotifier.addListener((event) {
print('Event received: ${event.message}');
});
4. 发布事件
你可以使用 notifyListeners
方法来发布事件。所有订阅了该事件的监听器都会收到通知。
eventNotifier.notifyListeners(MyEvent('Hello, World!'));
5. 取消订阅
如果你不再需要监听事件,可以使用 removeListener
方法来取消订阅。
eventNotifier.removeListener(listener);
完整示例
以下是一个完整的示例,展示了如何使用 typed_event_notifier
来管理事件通知。
import 'package:flutter/material.dart';
import 'package:typed_event_notifier/typed_event_notifier.dart';
class MyEvent extends TypedEvent {
final String message;
MyEvent(this.message);
}
void main() {
final eventNotifier = TypedEventNotifier<MyEvent>();
// 订阅事件
eventNotifier.addListener((event) {
print('Event received: ${event.message}');
});
// 发布事件
eventNotifier.notifyListeners(MyEvent('Hello, World!'));
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Typed Event Notifier Example'),
),
body: Center(
child: Text('Check the console for event output.'),
),
),
);
}
}