Я только что узнал, как я могу использовать Bloc
в приложениях флаттера, и в моем простом приложении у меня есть несколько отдельных классов представления, таких как App
и MainPage
, и я реализовал простой шаблон Bloc
для обработки события нажатия на некоторых виджетах. такие как кнопка
после запуска приложения мой реализованный шаблон блока работает только один раз и отображает сообщение в консоли, а после повторного щелчка не работает, чтобы отобразить сообщение
мой main.dart
класс
void main() {
runApp(MaterialApp(
debugShowCheckedModeBanner: false,
title: Strings.appName,
theme: ThemeData(
primarySwatch: Colors.indigo,
),
home: App(),
));
}
class App extends StatefulWidget {
final HomeBloc homeBloc = HomeBloc();
@override
State<App> createState() => MainPage();
}
MainPage
класс:
class MainPage extends State<App> {
@override
void initState() {
super.initState();
}
HomeBloc get _homeBloc => widget.homeBloc;
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: Strings.appName,
theme: ThemeData(
primarySwatch: Colors.indigo,
),
home: BlocBuilder<HomeEvent,HomeState>(
bloc: _homeBloc,
builder: (BuildContext context, HomeState state) {
if (state is HandleDrawerMenuClick) {
_onWidgetDidBuild(() {
print("clicked on drawer menu");
});
}
return Scaffold(
body: Center(
child: RaisedButton(
child: Text('ddddddddd'),
onPressed: () {
_homeBloc.dispatch(OnDrawerMenuClicked());
},
),
),
);
}),
);
}
@override
void dispose() {
_homeBloc.dispose();
super.dispose();
}
void _onWidgetDidBuild(Function callback) {
WidgetsBinding.instance.addPostFrameCallback((_) {
callback();
});
}
}
HomeBloc
класс:
class HomeBloc extends Bloc<HomeEvent, HomeState> {
@override
HomeState get initialState => HomeState();
@override
Stream<HomeState> mapEventToState(HomeEvent event) async* {
if (event is OnDrawerMenuClicked) {
yield HandleDrawerMenuClick();
}
}
}
HomeEvent
класс:
class HomeEvent extends Equatable {
HomeEvent([List props = const []]) : super(props);
}
class OnDrawerMenuClicked extends HomeEvent {
OnDrawerMenuClicked() : super([]);
@override
String toString() => 'OnDrawerMenuClicked clicked';
}
HomeState
класс:
class HomeState extends Equatable{
HomeState([List props = const[]]):super(props);
}
class HandleDrawerMenuClick extends HomeState{
@override
String toString()=>'HandleDrawerMenuClick';
}
я думаю, что проблема в HandleDrawerMenuClick
классе, потому что когда я отлаживаю приложение, отладка может перейти в if
оператор в этой строке:
if (event is OnDrawerMenuClicked) {
yield HandleDrawerMenuClick();
}
и я думаю, что двойной щелчок по кнопке не может вызвать yield HandleDrawerMenuClick();