1

flitter BLoCを使用してあるページから別のページに移動すると、最初のページが 2 番目に到達する前に再構築されるという 1 つの問題に直面しています。BlocBuilderbuildWhenを使用してページの再構築を制限することはできますが、問題は、バック プレスで最初のページに戻ったときに、ページが以前の状態のウィジェットを表示できないことです。ページを再構築せずにページ間のナビゲーションを管理する方法がわかりません。以下のflutter_bloc 6.1.1を使用しています。

先頭ページ

class FirstPage extends StatefulWidget {
final MyData dataObj;

FirstPage({this.dataObj});

@override
_MyFirstPageState createState() => _MyFirstPageState();
}

class _MyFirstPageState extends State<FirstPage> {

FirstPageBloc _bloc = FirstPageBloc();
String _userAddress='';

@override
void initState() {
super.initState();
_bloc.add(UserInfoEvent(dataObj:widget.dataObj));
}

@override
Widget build(BuildContext context) {
return Scaffold(
    resizeToAvoidBottomPadding: false,
    appBar: AppBar(
      title: Text(StringConstants.APP_TITLE_HEADING),
    ),
    body: BlocListener<FirstPageBloc, FirstPageState>(
      cubit: _bloc,
      listenWhen: (previousState, state) {
        // return true/false to determine whether or not
        // to call listener with state

        return true;
      },
      listener: (context, state) async{
        if (state is LoadingState) {
          print('Loading ...');
        }
        if (state is DataInfoState) {
          _userAddress=state.userAddress;
        }
        if(state is ConfirmationState){
          Navigator.push(context, MaterialPageRoute(builder: (context) => SecondPage(dataObj: widget.dataObj)));
        }

      },
      child: BlocBuilder<FirstPageBloc, FirstPageState>(
          //bloc: _bloc,
          cubit: _bloc,
          buildWhen: (previousState, state) {
            // return true/false to determine whether or not
            // to rebuild the widget with state
            if(state is ConfirmationState){
              return false;
            }
            return true;
          },
          builder: (context, state) {
            if (state is LoadingState) {
              return Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    CircularProgressIndicator(valueColor:
                    AlwaysStoppedAnimation<Color>(ColorConstants.Primary),),
                    Text(StringConstants.PLEASE_WAIT)
                  ],),
              );
            }
            return _mainWidget();
          }),
     ),
  );
 }
}

ブロック

 class FirstPageBloc extends Bloc<FirstPageEvent, FirstPageState>{

 FirstPageBloc() : super(InitialState());

 @override
 Stream<FirstPageState> mapEventToState(FirstPageEvent event) async*{

// TODO: implement mapEventToState
if(event is DataInfoEvent){
  yield* _getUserData(event.dataObj);
}
if(event is ConfirmationEvent){
  yield* _confirmTaskData(event.dataObj);
 }
}
 Stream<DelConfirmState> _confirmTaskData(MyData dataObj) async* {
  yield LoadingState();

  //Performing some SQLite DB operations

  yield ConfirmationState();

}
Stream<DelConfirmState> _getUserData(MyData dataObj) async* {

  yield LoadingState();
  String userAddress='ABDC001, PIN- 0091910, 5th Main USA';
  //Fetching User data from SQLite database and passing to UI

  yield DataInfoState(userAddress:userAddress);
 }
}

  abstract class FirstPageState extends Equatable {}

 ///This is our initial state
 class InitialState extends FirstPageState {
 @override
 List<Object> get props => null;
 }

 //This state will call for loading the progress var
class LoadingState extends FirstPageState {
@override
List<Object> get props => [];
}

//This state will call for loading the progress var
class ErrorState extends FirstPageState {
final String errorMessage;

ErrorState({@required this.errorMessage});
@override
List<Object> get props => [];
}

//This state will retun the userdata
class DataInfoState extends FirstPageState {
final String userAddress;

DataInfoState({@required this.userAddress});

@override
// TODO: implement props
List<Object> get props => [];
}
class TaskConfirmationState extends FirstPageState {

ConfirmationState({});

@override
// TODO: implement props
List<Object> get props => [];
}

イベント

   abstract class FirstPageEvent extends Equatable {}

   class GetUserInfoEvent extends FirstPageEvent {
   final MyData dataObj;

   GetUserInfoEvent({this.taskObj});
   @override
   List<Object> get props => [];
  }
  class ConfirmationEvent extends FirstPageEvent {
  final MyData dataObj
  ConfirmationEvent({this.dataObj});
  @override
  List<Object> get props => [];
 }

教えてください よろしくお願いします

4

1 に答える 1