Flutter事件处理插件eventful_widget的使用
Flutter事件处理插件eventful_widget的使用
eventful_widget
一个使用bloc来鼓励逻辑与外观分离的Flutter包。
关于
这个包提供了两个有用的抽象类——EventfulWidget
和 StateInjectedWidget
。通过继承这些类,可以实现简单且清晰的状态管理。正确使用此包将为您提供一条清晰的路径,轻松测试业务逻辑组件以及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
更多关于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. 自定义事件处理
你可以根据需要自定义事件处理逻辑。例如,你可以使用 Stream
或 StreamController
来处理更复杂的事件流。
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(),
));
}