Библиотека блоков Флаттера

#flutter #dart #flutter-bloc

#трепетание #дротик #флаттер-блок

Вопрос:

В приложении я пытаюсь реализовать функциональность корзины. ItemDetailsScreen имеет addItemBtn , который возвращает null после добавления элемента. Эта функция работает нормально, но проблема в том, что когда я захожу в cartScreen и очищаю корзину, а затем возвращаюсь к ItemDetailsScreen, addItemBtn по-прежнему возвращает null . Чтобы вернуть состояние добавления, я должен использовать горячую перезагрузку. Похоже, состояние не обновляется !? Итак, как это решить?

addItemBtn Добавить:

    BlocBuilder<CartFunctionsCubit, CartFunctionsState>(
      builder: (context, state) {
        return state.map(
          initial: (_) => Container(),
          cartLoaded: (state) => FlatButton(
            onPressed: state.userCart.items.contains(item)
                ? null
                : () {
                    context.read<CartFunctionsCubit>().addToCart(item);
                    context.read<CartFunctionsCubit>().startApp();
                  },
            child: state.userCart.items.contains(item)
                ? Text('Added')
                : Text('Add'),
          ),
        );
      },
    );
 

Cubit:

  Future<void> startApp() async {
    final userCart = await cartFacade.getUserCart();

    emit(CartFunctionsState.cartLoaded(userCart: userCart));
  }

  Future<void> addToCart(Item item) async {
    cartFacade.addToCart(item);
  }
 

Перейдите к экрану корзины, который я использую

  Navigator.of(context).pushNamed('/cart');
 

Ответ №1:

вы можете дождаться функции push, а затем вызвать context.read<CartFunctionsCubit>().startApp();

 await Navigator.of(context).pushNamed('/cart');
 context.read<CartFunctionsCubit>().startApp();
 

Данные будут обновлены, когда вы вернетесь со страницы корзины

И если вы хотите изменить данные при изменении чего-либо на странице корзины. дайте логическое значение в Navigator.pop()

На странице корзины

  bool needToRefresh = false/// when there is a change set needToRefresh = true
    Navigator.pop(context,needToRefresh );/// and pass the value here
 

На экране сведений об элементе

 bool needToRefresh = await Navigator.of(context).pushNamed('/cart');
if(needToRefresh !=null amp;amp; needToRefresh)
   context.read<CartFunctionsCubit>().startApp();
 

Данные будут обновляться только тогда, когда значение needToRefresh равно true;