首页 > 解决方案 > 颤振:StreamSink无法从函数“chuckDataSink”返回,因为它的返回类型为 StreamSink>?

问题描述

通过迁移到 Flutter 2,我收到以下错误。

lib/blocs/chuck_category_bloc.dart:12:7: 错误: 'StreamSink?' 类型的值 无法从返回类型为“StreamSink<Response>?”的函数返回。

下面是代码

import 'dart:async';
import 'package:upgrade_noyelling/models/chuck_response.dart';
import 'package:upgrade_noyelling/networking/Response.dart';
import 'package:upgrade_noyelling/repository/chuck_repository.dart';

class ChuckBloc {
   ChuckRepository ? _chuckRepository;
   StreamController ?  _chuckDataController;
   bool ? _isStreaming;

  StreamSink<Response<chuckResponse>>? get chuckDataSink =>
      _chuckDataController.sink;

  Stream<Response<chuckResponse>> get chuckDataStream =>
      _chuckDataController!.stream;

  ChuckBloc(String category) {
    _chuckDataController = StreamController<Response<chuckResponse>>();
    _chuckRepository = ChuckRepository();
    _isStreaming = true;
    fetchChuckyJoke(category);
  }

  fetchChuckyJoke(String category) async {
    chuckDataSink!.add(Response.loading('Getting a Chucky joke!'));
    try {
      chuckResponse chuckJoke = await _chuckRepository!.fetchChuckJoke(category);
      if (_isStreaming!) chuckDataSink!.add(Response.completed(chuckJoke));
    } catch (e) {
      if (_isStreaming!) chuckDataSink!.add(Response.error(e.toString()));
      print(e);
    }
  }

  dispose() {
    _isStreaming = false;
    _chuckDataController?.close();
  }
}

标签: flutterstream-builder

解决方案


我在升级到 Flutter 2 后遇到了完全相同的问题。我设法通过使用以下方法解决了这个问题:

    class ChuckBloc {
       ChuckRepository ? _chuckRepository;
       final  _chuckDataController = StreamController<Response<chuckResponse>>();
       bool ? _isStreaming;

       StreamSink<Response<chuckResponse>> get chuckDataSink =>_chuckDataController.sink;

       Stream<Response<chuckResponse>> get chuckDataStream =>_chuckDataController!.stream;

       ChuckBloc(String category) {
          _chuckRepository = ChuckRepository();
          _isStreaming = true;
          fetchChuckyJoke(category);
       }
       
       //the rest of your code here...
       
    }

您可以删除“?” 在chuckDataSink 上也因为它不会为空


推荐阅读