在Flutter中,emit通常与状态管理库(如Bloc或Cubit)一起使用,用于发出状态变化的事件。emit是Cubit和Bloc类中的一个方法,用于触发状态更新。
1. 使用Cubit的emit
Cubit是Bloc库中的一个轻量级状态管理工具。你可以使用emit方法来更新状态。
示例代码:
import 'package:flutter_bloc/flutter_bloc.dart';
// 定义状态类
class CounterState {
final int count;
CounterState(this.count);
}
// 定义Cubit类
class CounterCubit extends Cubit<CounterState> {
CounterCubit() : super(CounterState(0));
// 增加计数器的方法
void increment() {
emit(CounterState(state.count + 1));
}
// 减少计数器的方法
void decrement() {
emit(CounterState(state.count - 1));
}
}
使用Cubit:
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (context) => CounterCubit(),
child: CounterPage(),
),
);
}
}
class CounterPage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final counterCubit = context.read<CounterCubit>();
return Scaffold(
appBar: AppBar(title: Text('Counter App')),
body: Center(
child: BlocBuilder<CounterCubit, CounterState>(
builder: (context, state) {
return Text('Count: ${state.count}');
},
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: () => counterCubit.increment(),
child: Icon(Icons.add),
),
SizedBox(height: 10),
FloatingActionButton(
onPressed: () => counterCubit.decrement(),
child: Icon(Icons.remove),
),
],
),
);
}
}
2. 使用Bloc的emit
Bloc是Cubit的一个更复杂的版本,它使用事件来触发状态变化。emit方法在Bloc中用于在事件处理过程中发出新的状态。
示例代码:
import 'package:flutter_bloc/flutter_bloc.dart';
// 定义事件类
abstract class CounterEvent {}
class IncrementEvent extends CounterEvent {}
class DecrementEvent extends CounterEvent {}
// 定义状态类
class CounterState {
final int count;
CounterState(this.count);
}
// 定义Bloc类
class CounterBloc extends Bloc<CounterEvent, CounterState> {
CounterBloc() : super(CounterState(0)) {
on<IncrementEvent>(_onIncrement);
on<DecrementEvent>(_onDecrement);
}
void _onIncrement(IncrementEvent event, Emitter<CounterState> emit) {
emit(CounterState(state.count + 1));
}
void _onDecrement(DecrementEvent event, Emitter<CounterState> emit) {
emit(CounterState(state.count - 1));
}
}
使用Bloc:
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (context) => CounterBloc(),
child: CounterPage(),
),
);
}
}
class CounterPage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final counterBloc = context.read<CounterBloc>();
return Scaffold(
appBar: AppBar(title: Text('Counter App')),
body: Center(
child: BlocBuilder<CounterBloc, CounterState>(
builder: (context, state) {
return Text('Count: ${state.count}');
},
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: () => counterBloc.add(IncrementEvent()),
child: Icon(Icons.add),
),
SizedBox(height: 10),
FloatingActionButton(
onPressed: () => counterBloc.add(DecrementEvent()),
child: Icon(Icons.remove),
),
],
),
);
}
}