Flutter 导航到新页面时防止颤振块状态更改

Flutter 导航到新页面时防止颤振块状态更改,flutter,bloc,flutter-bloc,Flutter,Bloc,Flutter Bloc,我是一个新使用flutter_bloc的人,目前在我的项目中面临一个问题 所以,我有一个类似这样的群体课程: class TestBloc extends Bloc<TestEvent, TestState> { @override TestState get initialState => InitialTestState(); @override Stream<TestState> mapEventToState( TestEvent

我是一个新使用flutter_bloc的人,目前在我的项目中面临一个问题

所以,我有一个类似这样的群体课程:

class TestBloc extends Bloc<TestEvent, TestState> {
  @override
  TestState get initialState => InitialTestState();

  @override
  Stream<TestState> mapEventToState(
    TestEvent event,
  ) async* {
    if (event is StateOneEvent) {
      yield StateOne("one");
    } else if (event is StateTwoEvent) {
      yield StateTwo("two");
    }
  }
}

/// === Event class
abstract class TestEvent extends Equatable {
  const TestEvent();
}

class StateOneEvent extends TestEvent {
  @override
  List<Object> get props => [];
}

class StateTwoEvent extends TestEvent {
  @override
  List<Object> get props => [];
}


// == State class
abstract class TestState extends Equatable {
  const TestState();
}

class InitialTestState extends TestState {
  @override
  List<Object> get props => [];
}

class StateOne extends TestState {
  final String value;

  StateOne(this.value);

  @override
  List<Object> get props => [value];
}

class StateTwo extends TestState {
  final String value;

  StateTwo(this.value);

  @override
  List<Object> get props => [value];
}
这里有两页,第一页和第二页。此类中的每个类都将显示集团的当前状态

class FirstPage extends StatefulWidget {
  @override
  _FirstPageState createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  @override
  void initState() {
    super.initState();
    BlocProvider.of<TestBloc>(context).add(StateOneEvent());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(body: BlocBuilder<TestBloc, TestState>(
      builder: (_, state) {
        String value = '-';
        if (state is StateOne) {
          value = state.value;
        } else if (state is StateTwo) {
          value = state.value;
        }
        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(value),
              RaisedButton(
                onPressed: () {
                  Navigator.pushNamed(context, '/second_page');
                },
                child: Text('Goto Second Page'),
              )
            ],
          ),
        );
      },
    ));
  }
}

class SecondPage extends StatefulWidget {
  @override
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  @override
  void initState() {
    super.initState();
    BlocProvider.of<TestBloc>(context).add(StateTwoEvent());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(body: BlocBuilder<TestBloc, TestState>(
      builder: (_, state) {
        String value = '-';
        if (state is StateOne) {
          value = state.value;
        } else if (state is StateTwo) {
          value = state.value;
        }
        return Center(
          child: Text(value),
        );
      },
    ));
  }
}

很难说你到底想达到什么目的

如果您希望两个页面能够在同一数据上具有不同的状态,那么可以为每个页面使用不同的Bloc实例

如果希望两个页面具有相同的Bloc,但对状态的反应不同,则可以使用
BlocBuilder
buildWhen
方法来控制生成器实际需要重建UI的时间。第一页的示例:

BlocBuilder<TestBloc, TestState>(
    buildWhen: (prevState, curState) {
        return curState is StateOne
    }
    builder: (_, state) {
        String value = state.value;
        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(value),
              RaisedButton(
                onPressed: () {
                  Navigator.pushNamed(context, '/second_page');
                },
                child: Text('Goto Second Page'),
             )
           ],
        ),
     );
},
BlocBuilder(
buildWhen:(prevState,curState){
返回curState是StateOne
}
建筑商:(u,州){
字符串值=state.value;
返回中心(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(值),
升起的按钮(
已按下:(){
Navigator.pushNamed(上下文“/second_page”);
},
子项:文本(“转到第二页”),
)
],
),
);
},

但我认为,在您的情况下,您希望拥有同一块的单独实例。buildWhen主要用于您只想在部分状态发生变化时重建,而这需要反映在UI中。

很难说您到底想要实现什么

如果您希望两个页面能够在同一数据上具有不同的状态,那么可以为每个页面使用不同的Bloc实例

如果希望两个页面具有相同的Bloc,但对状态的反应不同,则可以使用
BlocBuilder
buildWhen
方法来控制生成器实际需要重建UI的时间。第一个页面的示例:

BlocBuilder<TestBloc, TestState>(
    buildWhen: (prevState, curState) {
        return curState is StateOne
    }
    builder: (_, state) {
        String value = state.value;
        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(value),
              RaisedButton(
                onPressed: () {
                  Navigator.pushNamed(context, '/second_page');
                },
                child: Text('Goto Second Page'),
             )
           ],
        ),
     );
},
BlocBuilder(
buildWhen:(prevState,curState){
返回curState是StateOne
}
建筑商:(u,州){
字符串值=state.value;
返回中心(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(值),
升起的按钮(
已按下:(){
Navigator.pushNamed(上下文“/second_page”);
},
子项:文本(“转到第二页”),
)
],
),
);
},

但我认为在您的情况下,您希望拥有同一个Bloc的单独实例。buildWhen主要用于您只想在部分状态发生变化时重建,这需要反映在UI中。

谢谢您,Puelo。您已经帮了很多忙。但是您能否也分享一下如何实现“独特的Bloc实例”?您需要有两个不同的
BlocProviders
为您的页面提供实例,而不是两个都只有一个。谢谢您,Puelo。您已经很有帮助了。但是您还可以分享如何实现“独特的Bloc实例”吗?您需要有两个不同的
BlocProviders
为您的页面提供实例,而不是两个都只有一个。请尝试将更新作为响应提交,以便可以看到。许多读者(包括我自己!)不会阅读整个问题。请尝试将更新作为响应提交,以便可以看到。许多读者,(包括我自己!),不要读整个问题。
BlocBuilder<TestBloc, TestState>(
    buildWhen: (prevState, curState) {
        return curState is StateOne
    }
    builder: (_, state) {
        String value = state.value;
        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(value),
              RaisedButton(
                onPressed: () {
                  Navigator.pushNamed(context, '/second_page');
                },
                child: Text('Goto Second Page'),
             )
           ],
        ),
     );
},