flutter - BLoC:多次调用监听回调
问题描述
我有一个有状态的小部件,它从其父级获取一个块:
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)),
)
],
),
));
}
}
我想要做的是检查,当用户按下按钮时,插入的字符串是否正确。我在集团中调用的方法是:
void isMnemonicCorrect(String typedMnemonic){
if(typedMnemonic == _lastGeneratedMnemonic)
_inCheckMnemonic.add(true);
else
_inCheckMnemonic.add(false);
}
_inCheckMnemonic 是我的主题的接收器(我正在使用 rxDart),而 outCheckMnemonic 是我的流。问题是,即使 bloc 的“isCorrect”方法被调用一次,listen 回调也被调用了两次(SnackBar 显示了两次)。为什么会这样?
编辑:我只需使用 Navigator.push 导航到 Page():
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) {
return Page();
}));
我能够检索 bloc,因为当我的应用程序启动时,我初始化了 bloc:
return runApp(BlocProvider<ApplicationBloc>(
bloc: ApplicationBloc(),
child: BlocProvider<MnemonicLogicBloc>(
bloc: MnemonicLogicBloc(),
child: BlocProvider<HomePageBloc>(
bloc: HomePageBloc(),
child: App(),
),
)
));
解决方案
当您在构建器中添加新Widget
的时,Navigator
避免在构建器中创建该小部件,而是在外部声明一个变量并在构建器中重用该变量,如下所示:
final page = Page();
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) => page ), );
通过这种改变,我们避免了我们的小部件以意想不到的方式被重新创建了很多次。
推荐阅读
- javascript - Puppeteer 选择查询 - 如何在 Puppeteer 中选择此查询?
- bash - 如何在不使用期望命令的情况下从 shell 脚本提供密码
- docker - Docker启动有什么意义吗?
- php - 根据 acf 字段将页面发布状态更改为草稿
- flutter - 遍历一个列表并使用它来初始化另一个变量
- r - 在 cox 回归结果中使用标签
- firebase - 未考虑在特定路径写入的 Firebase 存储规则
- c# - 我自己写的Interceptor在autofac中注册无法拦截
- php - Laravel ``$user->can("...")`` 抛出服务器错误 500
- c# - All input fields are cleared when submitting the form ASP.NET