工作中Flutter遇到的问题

    技术2022-07-10  139

    在学习Flutter遇到的问题

    在使用Bloc遇到的问题 BlocProvider.of() called with a context that does not contain a Bloc of type .

    是因为BlocProvider.of(context) 中context的对象不对, 因为我是在State里面写的一个方法,所以context是State的context, 而不是 BlocBuilder中builder(context ,state)的这个context对象; 所以需要将抽出来的方法传入这个BlocBuilder中的context, 然后调用BlocProvider.of(context) 就没有问题了

    按钮倒计时 使用StreamController与StreamBuilder来进行创建 这是CountdownButtonBloc /// 倒计时工具类 class CountdownButtonBloc { StreamController<String> _controller = new StreamController(); StreamSink get _streamSink => _controller.sink; Stream<String> get stream => _controller.stream; /// 判断当前事件是否结束,默认true是结束的。 bool _isFinish = true; Timer _timer; void dispose() { _stopTimer(); _controller.close(); } /// 开始计时 /// [totalTime] 倒计时的时间 /// [initText] 初始显示的text void startCountdown(int totalTime, String initText) { if (!_isFinish) { return; } _streamSink.add("$totalTime s Resend"); // 倒计时开始 _timer = Timer.periodic(Duration(seconds: 1), (timer) { if (_controller.isClosed) { _stopTimer(); } final event = totalTime - timer.tick; print("event----> $event"); if (event <= 0) { _streamSink.add(initText); _stopTimer(); } else { _streamSink.add("$event s Resend"); _isFinish = false; } }); } // 停止计时 _stopTimer() { if (_timer != null) { _timer.cancel(); _timer = null; } _isFinish = true; } // 计时是否结束 bool isFinish() { return _isFinish; } }

    使用的时候,就可以直接创建并使用;

    CountdownButtonBloc _countdownButtonBloc = CountdownButtonBloc(); Center( child: StreamBuilder( stream: _countdownButtonBloc.stream, builder: (context, snapShot) { return RaisedButton( onPressed: _countdownButtonBloc.isFinish() ? () { _countdownButtonBloc.startCountdown(13, "send code"); } : () {}, textColor: Colors.red, disabledTextColor: Colors.red, child: Text(snapShot.data ?? "send code"), ); }, ), ) 、、、 最后记得添加这行代码就行, @override void dispose() { _countdownButtonBloc.dispose(); super.dispose(); }
    Processed: 0.021, SQL: 9