Flutter事件传递插件single_live_event的使用

Flutter事件传递插件single_live_event的使用

在Flutter开发中,有时我们需要一种机制来处理只发送一次的事件,例如导航事件或Snackbar消息。single_live_event 是一个基于 ValueNotifier 的实现,它只在订阅后发送新的更新。

Description

single_live_event 是一个特殊的 ValueNotifier,它可以确保在订阅后只发送新的更新。这种特性非常适合用于导航事件、Snackbar消息等场景。

该插件改编自 Android 的 android-architecture-sample 中的 SingleLiveEvent

此软件发布于 MIT 许可证下,详情请查看 LICENSE.txt。


使用步骤

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 single_live_event 依赖:

dependencies:
  single_live_event: ^0.2.0

然后运行以下命令安装依赖:

flutter pub get

2. 创建单次事件监听器

我们可以通过 SingleLiveEvent 来创建一个单次事件监听器,并在需要时触发事件。

import 'package:flutter/material.dart';
import 'package:single_live_event/single_live_event.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: EventPage(),
    );
  }
}

class EventPage extends StatefulWidget {
  [@override](/user/override)
  _EventPageState createState() => _EventPageState();
}

class _EventPageState extends State<EventPage> {
  final event = SingleLiveEvent<void>();

  [@override](/user/override)
  void initState() {
    super.initState();

    // 监听事件
    event.listen((_) {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('事件已触发')));
    });

    // 模拟事件触发
    Future.delayed(Duration(seconds: 3), () {
      event.value = null; // 触发事件
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('SingleLiveEvent 示例')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 手动触发事件
            event.value = null;
          },
          child: Text('触发事件'),
        ),
      ),
    );
  }
}

更多关于Flutter事件传递插件single_live_event的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter事件传递插件single_live_event的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


SingleLiveEvent 是一个在 Flutter 中用于处理一次性事件(如 Snackbars、Toasts、导航事件等)的常见模式。它通常与 LiveData 一起使用,以确保事件只被消费一次,避免在配置更改(如屏幕旋转)时重复触发事件。

1. 什么是 SingleLiveEvent

SingleLiveEventLiveData 的一个子类,它确保事件只被观察一次。这对于那些只需要触发一次的事件非常有用,比如显示一个 Snackbar 或导航到另一个页面。

2. 如何使用 SingleLiveEvent

首先,你需要创建一个 SingleLiveEvent 类。以下是一个简单的实现:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class SingleLiveEvent<T> extends ValueNotifier<T?> {
  SingleLiveEvent() : super(null);

  void call(T value) {
    this.value = value;
  }

  void consume() {
    value = null;
  }

  T? getValue() {
    final value = this.value;
    consume();
    return value;
  }
}

3. 在 ViewModel 中使用 SingleLiveEvent

假设你正在使用 ProviderGetX 等状态管理工具,你可以将 SingleLiveEvent 用于触发一次性事件。

class MyViewModel extends ChangeNotifier {
  final SingleLiveEvent<String> _snackbarEvent = SingleLiveEvent();

  SingleLiveEvent<String> get snackbarEvent => _snackbarEvent;

  void showSnackbar(String message) {
    _snackbarEvent.call(message);
  }
}

4. 在 UI 中监听 SingleLiveEvent

在 UI 中,你可以通过 ValueListenableBuilder 或直接在 ChangeNotifier 中监听 SingleLiveEvent

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final viewModel = Provider.of<MyViewModel>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('SingleLiveEvent Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            viewModel.showSnackbar('Hello, SingleLiveEvent!');
          },
          child: Text('Show Snackbar'),
        ),
      ),
      floatingActionButton: ValueListenableBuilder<String?>(
        valueListenable: viewModel.snackbarEvent,
        builder: (context, message, _) {
          if (message != null) {
            WidgetsBinding.instance!.addPostFrameCallback((_) {
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(content: Text(message)),
              );
              viewModel.snackbarEvent.consume();
            });
          }
          return Container();
        },
      ),
    );
  }
}
回到顶部