#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;