Простая реализация Flutter для обработки события нажатия с помощью блока один раз - PullRequest
0 голосов
/ 19 мая 2019

Я только что узнал, как я могу использовать 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();

...