首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >BLoC:多次调用监听回调

BLoC:多次调用监听回调
EN

Stack Overflow用户
提问于 2019-06-10 07:27:38
回答 1查看 2.8K关注 0票数 2

我有一个Stateful Widget,它从它的父级获取一个bloc:

代码语言:javascript
复制
class Page extends StatefulWidget {
  @override
  State<StatefulWidget> createState() =>
  _PageState();
}

class _PageState extends State<Page> {
  final TextEditingController mnemonicController = TextEditingController();
  final _scaffoldKey = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {

final MnemonicLogicBloc mnemonicLogicBloc =
BlocProvider.of<MnemonicLogicBloc>(context);

mnemonicLogicBloc.outCheckMnemonic.listen((isCorrect){
  if (!isCorrect) {
    SnackBar copySnack = SnackBar(content: Text('Wrong Mnemonic!'));
    _scaffoldKey.currentState.showSnackBar(copySnack);
  }
});

return Scaffold(
    key: _scaffoldKey,
    body: Container(
      width: double.infinity,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Container(
            child: TextField(
              controller: mnemonicController,
            ),
          ),
          RaisedButton(
            onPressed: () {
              mnemonicLogicBloc.isMnemonicCorrect(mnemonicController.text);
            },
            child: Text('Check', style: TextStyle(color: Colors.white)),
          )
        ],
      ),
    ));
}
}

我想要做的是,当用户按下按钮时,检查插入的字符串是否正确。我在代码块中调用的方法是:

代码语言:javascript
复制
void isMnemonicCorrect(String typedMnemonic){
if(typedMnemonic == _lastGeneratedMnemonic)
  _inCheckMnemonic.add(true);
else
  _inCheckMnemonic.add(false);
 }

_inCheckMnemonic是我的主题的接收器(我使用rxDart),而outCheckMnemonic是我的流。问题是,即使块的“isCorrect”方法被调用了一次,侦听回调也被调用了两次( SnackBar显示了两次)。这一切为什么要发生?

编辑:我只需使用Navigator.push导航到Page():

代码语言:javascript
复制
Navigator.of(context).push(MaterialPageRoute(
                            builder: (BuildContext context) {
                return Page();
}));

我能够检索块是因为,当我的应用程序启动时,我初始化了块:

代码语言:javascript
复制
return runApp(BlocProvider<ApplicationBloc>(
bloc: ApplicationBloc(),
child: BlocProvider<MnemonicLogicBloc>(
  bloc: MnemonicLogicBloc(),
  child: BlocProvider<HomePageBloc>(
    bloc: HomePageBloc(),
    child: App(),
  ),
)

));

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-10 08:07:26

当您在Navigator中添加新的Widget时,避免在构建器中创建该小部件,而是在外部声明一个变量,并在您的构建器中重用该变量,如下所示:

代码语言:javascript
复制
final page = Page();
Navigator.of(context).push(MaterialPageRoute(
                            builder: (BuildContext context) => page ), );

通过这种更改,我们可以避免以意外的方式多次重新创建我们的小部件。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56519093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档