我正在嘗試將 bloc 的簡單 cubit 示例轉換為 bloc 模式,但是...NoSuchMethodError: Class '_Emitter<MyObjectState>...當我按下增量按鈕時出現錯誤。
我相信我的問題是dynamic我用于emit引數的型別(將其更改為MyObjectState導致運算式不是函式的錯誤)。
那應該是什么,這是我唯一的問題嗎?
class MyObjectBloc extends Bloc<MyObjectEvent, MyObjectState> {
MyObjectBloc() : super(const MyObjectState(counter: 99)) {
on<AddEvent>(_onIncrement);
on<SubtractEvent>(_onDecrement);
}
void _onIncrement(AddEvent event, dynamic emit) => emit(counter: state.counter 1);
void _onDecrement(SubtractEvent event, dynamic emit) => emit(counter: state.counter - 1);
}
abstract class MyObjectEvent {
const MyObjectEvent();
}
class AddEvent extends MyObjectEvent {}
class SubtractEvent extends MyObjectEvent {}
class MyObjectState {
const MyObjectState({required this.counter});
final int counter;
}
class CounterPage extends StatelessWidget {
const CounterPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => MyObjectBloc(),
child: CounterView(),
);
}
}
class CounterView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final textTheme = Theme.of(context).textTheme;
return Scaffold(
body: Center(
child: BlocBuilder<MyObjectBloc, MyObjectState>(
builder: (context, state) {
return Text('${state.counter}', style: textTheme.headline2);
},
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () => context.read<MyObjectBloc>().add(AddEvent()),
),
FloatingActionButton(
child: const Icon(Icons.remove),
onPressed: () => context.read<MyObjectBloc>().add(SubtractEvent()),
),
],
),
);
}
}
uj5u.com熱心網友回復:
這里的問題是你emit錯了。
TLDR 答案
class MyObjectBloc extends Bloc<MyObjectEvent, MyObjectState> {
MyObjectBloc() : super(const MyObjectState(counter: 99)) {
on<AddEvent>(_onIncrement);
on<SubtractEvent>(_onDecrement);
}
void _onIncrement(AddEvent event, Emitter<MyObjectState> emit) => emit(MyObjectState(counter: state.counter 1));
void _onDecrement(SubtractEvent event, Emitter<MyObjectState> emit) => emit(MyObjectState(counter: state.counter - 1));
}
abstract class MyObjectEvent {
const MyObjectEvent();
}
class AddEvent extends MyObjectEvent {}
class SubtractEvent extends MyObjectEvent {}
class MyObjectState {
const MyObjectState({required this.counter});
final int counter;
}
解釋
如果我們仔細觀察on<EVENT>,它是一個函式:
void on<E extends Event>(
EventHandler<E, State> handler, {
EventTransformer<E>? transformer,
})
第一個論點EventHandler<E, State>是:
typedef EventHandler<Event, State> = FutureOr<void> Function(
Event event,
Emitter<State> emit,
);
所以你應該發出你的狀態類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/420277.html
標籤:
上一篇:如何洗掉prefixIcon和texformfield文本之間的空格?
下一篇:如何在顫振中添加并行組件
