工作中Flutter遇到的问题

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

工作中Flutter遇到的问题_第1张图片

  • 按钮倒计时
    • 使用StreamController与StreamBuilder来进行创建
这是CountdownButtonBloc 
/// 倒计时工具类
class CountdownButtonBloc {
  StreamController _controller = new StreamController();

  StreamSink get _streamSink => _controller.sink;

  Stream 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();
  }

你可能感兴趣的:(Flutter)