工作中Flutter遇到的问题

本文探讨了在Flutter中使用Bloc模式时遇到的常见问题,包括如何正确使用BlocProvider.of(context)解决context对象不匹配的问题,以及通过StreamController与StreamBuilder实现按钮倒计时功能的具体实践。
摘要由CSDN通过智能技术生成

在学习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) 就没有问题了

bloc的使用

  • 按钮倒计时
    • 使用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();
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值