不销毁Stream重置Counter Bloc计数 实现全局监听与页面返回重置需求
没问题,我来帮你搞定这个需求!咱们一步步来实现:
首先得给你的CounterBloc加个重置计数器的方法,这样在返回第一页时能把数值归0,同时把新值同步到Stream里,保证整个应用的监听都能拿到最新状态。
修改后的CounterBloc代码
import 'dart:async'; class CounterBloc { int _counter = 0; final StreamController<int> _countController = StreamController<int>.broadcast(); Stream<int> get counterStream => _countController.stream; StreamSink<int> get counterSink => _countController.sink; void incrementCounter() { _counter++; counterSink.add(_counter); } // 新增重置方法,把计数器归0并同步到Stream void resetCounter() { _counter = 0; counterSink.add(_counter); } // 别忘了加dispose,退出时关闭控制器防止内存泄漏 void dispose() { _countController.close(); } }
在第二页面处理返回逻辑
接下来要在第二页面拦截所有返回操作(不管是点导航栏的返回键,还是按物理返回键),在返回前触发重置。用WillPopScope就能完美搞定这个:
class SecondPage extends StatefulWidget { final CounterBloc counterBloc; const SecondPage({Key? key, required this.counterBloc}) : super(key: key); @override State<SecondPage> createState() => _SecondPageState(); } class _SecondPageState extends State<SecondPage> { @override Widget build(BuildContext context) { return WillPopScope( // 拦截物理返回键 onWillPop: () async { widget.counterBloc.resetCounter(); return true; // 允许返回 }, child: Scaffold( appBar: AppBar( title: const Text('第二页面'), leading: IconButton( icon: const Icon(Icons.arrow_back), onPressed: () { // 点击导航栏返回按钮时也重置 widget.counterBloc.resetCounter(); Navigator.pop(context); }, ), ), body: Center( child: StreamBuilder<int>( stream: widget.counterBloc.counterStream, initialData: 0, builder: (context, snapshot) { return Text( '计数器数值: ${snapshot.data}', style: const TextStyle(fontSize: 24), ); }, ), ), floatingActionButton: FloatingActionButton( onPressed: widget.counterBloc.incrementCounter, child: const Icon(Icons.add), ), ), ); } }
为啥这么做?
- 新增的
resetCounter方法不仅把_counter设为0,还会把这个值发送到Stream里,这样所有监听这个Stream的组件都会立刻收到0的更新。 WillPopScope负责处理物理返回键的场景,而导航栏的返回按钮我们手动加了重置逻辑,覆盖了所有返回第一页的情况。- 最后记得在应用退出的地方(比如主页面的
dispose方法里)调用counterBloc.dispose(),关闭Stream控制器,避免内存泄漏。 - 这样每次你回到第二页面时,计数器都会从0开始,而且Stream全程保持活跃,整个应用都能正常监听它的变化。
内容的提问来源于stack exchange,提问作者ajs.sonawane
相关产品推荐
相关产品推荐

