Flutter事件处理插件eventful_widget的使用

Flutter事件处理插件eventful_widget的使用

eventful_widget

一个使用bloc来鼓励逻辑与外观分离的Flutter包。


关于

这个包提供了两个有用的抽象类——EventfulWidgetStateInjectedWidget。通过继承这些类,可以实现简单且清晰的状态管理。正确使用此包将为您提供一条清晰的路径,轻松测试业务逻辑组件以及UI组件。


使用

首先定义您的事件状态

// 定义事件枚举
enum CoolEvent {
  somethingCool,
  somethingEvenCooler,
}

// 定义状态类
[@immutable](/user/immutable)
class CoolState {
  CoolState(this.message);
  final String message;
}

接下来创建我们的BLoC(业务逻辑组件)。

// 创建BLoC类
class CoolBloc extends Bloc<CoolEvent, CoolState> {
  CoolBloc() : super(CoolState('waiting for something cool to happen...')) {
    // 监听事件并更新状态
    on<CoolEvent>((event, emit) {
      String message = '';
      switch (event) {
        case CoolEvent.somethingCool:
          message = 'waiting for something cool to happen...';
          break;
        case CoolEvent.somethingEvenCooler:
          message = 'something REALLY cool happened!';
          break;
        default:
          message = 'this shouldn\'t ever happen';
      }
      emit(CoolState(message)); // 触发状态变化
    });
  }
}

然后创建一个使用新BLoC并委托绘制的widget,继承EventfulWidget并实现builder方法。

// 创建一个使用BLoC的widget
class CoolWidget extends EventfulWidget<CoolEvent, CoolState> {
  CoolWidget(Bloc<CoolEvent, CoolState> bloc) : super(bloc);

  [@override](/user/override)
  StateInjectedWidget<CoolEvent, CoolState> builder(
      BuildContext context, CoolState state, void Function(CoolEvent)? onEvent) =>
      CoolWidgetView(state, onEvent);
}

最后创建负责绘制UI的实际widget,确保继承StateInjectedWidget

// 创建负责绘制UI的widget
class CoolWidgetView extends StateInjectedWidget<CoolEvent, CoolState> {
  CoolWidgetView(CoolState state, void Function(CoolEvent)? onEvent)
      : super(state, onEvent: onEvent);

  [@override](/user/override)
  Widget builder(BuildContext context, CoolState state, void Function(CoolEvent)? onEvent) {
    return ElevatedButton(
      onPressed: () {
        if (state.message == 'waiting for something cool to happen...') {
          onEvent!(CoolEvent.somethingEvenCooler);
        } else {
          onEvent!(CoolEvent.somethingCool);
        }
      },
      child: Text(state.message),
    );
  }
}

现在你可以像这样使用CoolWidget

void main() {
  final bloc = CoolBloc();

  runApp(MaterialApp(
    home: Center(
      child: CoolWidget(bloc),
    ),
  ));
}

示例代码

以下是一个完整的示例代码,展示如何使用eventful_widget包。

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

// 定义事件和状态
enum CoolEvent {
  somethingCool,
  somethingEvenCooler,
}

[@immutable](/user/immutable)
class CoolState {
  CoolState(this.message);
  final String message;
}

// 创建BLoC
class CoolBloc extends Bloc<CoolEvent, CoolState> {
  CoolBloc() : super(CoolState('waiting for something cool to happen...')) {
    on<CoolEvent>((event, emit) {
      String message = '';
      switch (event) {
        case CoolEvent.somethingCool:
          message = 'waiting for something cool to happen...';
          break;
        case CoolEvent.somethingEvenCooler:
          message = 'something REALLY cool happened!';
          break;
        default:
          message = 'this shouldn\'t ever happen';
      }
      emit(CoolState(message));
    });
  }
}

// 创建使用BLoC的widget
class CoolWidget extends EventfulWidget<CoolEvent, CoolState> {
  CoolWidget(Bloc<CoolEvent, CoolState> bloc) : super(bloc);

  [@override](/user/override)
  StateInjectedWidget<CoolEvent, CoolState> builder(
      BuildContext context, CoolState state, void Function(CoolEvent)? onEvent) =>
      CoolWidgetView(state, onEvent);
}

// 创建负责绘制UI的widget
class CoolWidgetView extends StateInjectedWidget<CoolEvent, CoolState> {
  CoolWidgetView(CoolState state, void Function(CoolEvent)? onEvent)
      : super(state, onEvent: onEvent);

  [@override](/user/override)
  Widget builder(BuildContext context, CoolState state, void Function(CoolEvent)? onEvent) {
    return ElevatedButton(
      onPressed: () {
        if (state.message == 'waiting for something cool to happen...') {
          onEvent!(CoolEvent.somethingEvenCooler);
        } else {
          onEvent!(CoolEvent.somethingCool);
        }
      },
      child: Text(state.message),
    );
  }
}

void main() {
  final bloc = CoolBloc();

  runApp(MaterialApp(
    home: Center(
      child: CoolWidget(bloc),
    ),
  ));
}

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

1 回复

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


eventful_widget 是一个 Flutter 插件,用于简化事件处理逻辑。它允许你在 Flutter 应用中更轻松地管理和处理事件,特别是在需要处理多个事件或复杂事件流的情况下。以下是如何使用 eventful_widget 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 eventful_widget 依赖:

dependencies:
  flutter:
    sdk: flutter
  eventful_widget: ^0.1.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入包

在你的 Dart 文件中导入 eventful_widget

import 'package:eventful_widget/eventful_widget.dart';

3. 使用 EventfulWidget

EventfulWidget 是一个可以处理事件的 Widget。你可以通过继承 EventfulWidget 来创建自定义的 Widget,并在其中处理事件。

以下是一个简单的示例,展示了如何使用 EventfulWidget 来处理按钮点击事件:

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

class MyEventfulWidget extends EventfulWidget {
  MyEventfulWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyEventfulWidgetState createState() => _MyEventfulWidgetState();
}

class _MyEventfulWidgetState extends EventfulWidgetState<MyEventfulWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Eventful Widget Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: MyEventfulWidget(),
  ));
}

4. 处理事件

在上面的示例中,_incrementCounter 方法处理了按钮的点击事件,并更新了 _counter 的值。EventfulWidget 本身并没有提供特殊的事件处理机制,但它可以帮助你更好地组织和管理事件处理逻辑。

5. 自定义事件处理

你可以根据需要自定义事件处理逻辑。例如,你可以使用 StreamStreamController 来处理更复杂的事件流。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:eventful_widget/eventful_widget.dart';

class MyEventfulWidget extends EventfulWidget {
  MyEventfulWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyEventfulWidgetState createState() => _MyEventfulWidgetState();
}

class _MyEventfulWidgetState extends EventfulWidgetState<MyEventfulWidget> {
  int _counter = 0;
  final StreamController<int> _counterController = StreamController<int>();

  void _incrementCounter() {
    _counter++;
    _counterController.add(_counter);
  }

  [@override](/user/override)
  void dispose() {
    _counterController.close();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Eventful Widget Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            StreamBuilder<int>(
              stream: _counterController.stream,
              initialData: 0,
              builder: (context, snapshot) {
                return Text(
                  '${snapshot.data}',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: MyEventfulWidget(),
  ));
}
回到顶部