Одно и то же событие BLo C не запускается более одного раза - PullRequest
0 голосов
/ 04 августа 2020

Я HomeBloc из класса HomeView. Базовая c Архитектура пользовательского интерфейса следующая:

HomeView extends StatelessWidget {
    BlocProvider( child: HomeBody(), bloc: new HomeBloc() )
}

HomeBody extends StatefulWidget {
    createState => HomeBodyState()
}

HomeBodyState extends State {
    BlocBuilder(
        bloc: BlocProvider.of<HomeBloc>()
        child: Container(
            child: Column(
                children: [
                    BlocProvider( child: CashFlowView, bloc: new HomeBloc() )
                ]
            )
        )
    )
}

CashFlowView extends StatefulWidget {
    createState => CashFlowState()
}

CashFlowState extends State {
    BlocBuilder(
        bloc: BlocProvider.of<HomeBloc>()
        child: Container(
            child: Column(
                children: [
                    ChipGroupWidget(
                      onClick => BlocProvider.of().add(event) //  <----- Problem is here
                    )
                ]
            )
        )
    )
}

Весь код можно найти в этом репозитории . Проблема в том, что при нажатии любого Chip внутри моего ChipGroup функция обратного вызова вызывается в CashFlowState. Внутри него событие blo c добавляется к blo c с некоторыми данными. Но срабатывает только впервые. Что не так в моем коде?

1 Ответ

0 голосов
/ 05 августа 2020

В системе паттернов flutter blo c UI перестраивается только при изменении состояния. Если в любом случае, когда запущенное событие вызывает то же состояние, в котором в настоящее время находится blo c, функция сборки не будет вызываться снова, т.е. пользовательский интерфейс не будет перестроен.

В вашем случае , когда впервые выдается CashFlowState, весь код работает нормально. Но затем снова возвращается то же состояние, событие запускается, но функция построения больше не вызывается, потому что состояние никогда не менялось.

Что вам нужно сделать, так это создать два разных состояния вместе с два разных события. Допустим, chipTappedEvent даст chipTappedState, а chipResetEvent даст chipResetState.

Вначале вы можете использовать chipResetState или любое другое состояние в качестве начального состояния. Затем, когда пользователь нажимает на чип, просто активируйте chipTappedEvent, который должен дать chipTappedState.

В вашем слушателе прослушайте состояние chipTappedState и сделайте то, что вы должны сделать. Затем немедленно вызовите chipResetEvent, который должен дать chipResetState. Таким образом, когда пользователь снова коснется чипа, полученное состояние будет chipTappedState, которое будет отличаться от chipResetState, поэтому функция сборки будет вызвана снова.

...