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

1 回复

更多关于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.'),
        ),
      ),
    );
  }
}
回到顶部