值未使用 bloc 更新在底部 showModalBottomSheet 内

问题描述 投票:0回答:1
这是我的主屏幕:

class CreateApplyScreen extends StatefulWidget { const CreateApplyScreen({super.key}); @override State<CreateApplyScreen> createState() => _CreateApplyScreenState(); } class _CreateApplyScreenState extends State<CreateApplyScreen> { final bloc = CreateApplyBloc(); @override Widget build(BuildContext context) { return Scaffold( body: BlocProvider<CreateApplyBloc>( create: (context) => bloc, child: CustomWillPopScope( onWillPop: false, action: () {}, child: ValueListenableBuilder<int>( valueListenable: currentPage, builder: (BuildContext context, int value, Widget? child) { return Padding( padding: const EdgeInsets.only(left: 16.0, right: 16), child: PageView( controller: _pageController, physics: const NeverScrollableScrollPhysics(), children: [ CreditInfo( bloc: bloc, onCountinue: () { onNavigate(); }, ), ], ), ); }), ), ), ); }
我的第二个屏幕

class CreditInfo extends StatelessWidget { final CreateApplyBloc bloc; final Function onCountinue; const CreditInfo({super.key, required this.onCountinue, required this.bloc}); @override Widget build(BuildContext context) { return BlocConsumer<CreateApplyBloc, DataState>( listener: (context, state) {}, builder: (context, state) { if (state is CreateApplyState) { return Column( children: [ CustomTextField( hintText: state.selectedMonth == 0 ? AppStrings.select : '${state.selectedMonth} ay', onTap: () { showSuggestedMonths(context, () {},state,bloc); }, ), ], ); } return Container(); }); } }
和我的底部模态表:

showSuggestedMonths(BuildContext context, Function onTapYes, CreateApplyState state, CreateApplyBloc bloc) { showModalBottomSheet( backgroundColor: Colors.white, elevation: 0, isScrollControlled: true, context: context, builder: (_) => SuggestedMonthsModal( onTapYes: onTapYes, state: state, bloc: bloc, ctx: context)); } class SuggestedMonthsModal extends StatelessWidget { final Function onTapYes; final BuildContext ctx; final CreateApplyState state; final CreateApplyBloc bloc; const SuggestedMonthsModal( {super.key, required this.onTapYes, required this.state, required this.ctx, required this.bloc}); @override Widget build(BuildContext context) { return BlocProvider<CreateApplyBloc>( create: (context) => CreateApplyBloc(), child: Column( children: [ ModalViewWidget( widget: ListView.builder( shrinkWrap: true, itemCount: state.suggestedMonths.length, itemBuilder: (ctx, i) { return Column( children: [ InkWell( onTap: () { BlocProvider.of<CreateApplyBloc>(context).add(SelectMonthEvent(state.suggestedMonths[i])); }, child: Row( children: [ state.selectedMonth == state.suggestedMonths[i] ? SvgPicture.asset(AppImages.filledRadio) : SvgPicture.asset(AppImages.emptyRadio), ], ), ), ], ); }), ) ], ), ); } }
所以当我按下

onTap: () { BlocProvider.of<CreateApplyBloc>(context).add(SelectMonthEvent(state.suggestedMonths[i])); },
在这里更新我的代码,没有任何变化,状态没有更新。仅在热重载后更新。我认为问题出在传递上下文的地方。(不在我的块文件或状态中)我已经尝试了所有方法,但没有任何效果。

flutter dart
1个回答
0
投票
问题似乎在于您向小部件提供

CreateApplyBloc

 的方式。在您的 
SuggestedMonthsModal
 小部件中,您正在创建 
CreateApplyBloc
 
的新实例,该实例与您从 CreateApplyScreen 传递下来的实例不同。这意味着这个新集团中所做的任何状态更改都不会反映在旧集团中。

要解决此问题,您应该将块的相同实例传递给您的 SuggestedMonthsModal 小部件。具体方法如下:

@override Widget build(BuildContext context) { return BlocProvider<CreateApplyBloc>.value( value: bloc, child: Column( // your code
还有

InkWell(onTap: () { bloc.add(SelectMonthEvent(state.suggestedMonths[i])); }
    
© www.soinside.com 2019 - 2024. All rights reserved.