flutter - 颤振:StreamSink无法从函数“chuckDataSink”返回,因为它的返回类型为 StreamSink>?
问题描述
通过迁移到 Flutter 2,我收到以下错误。
lib/blocs/chuck_category_bloc.dart:12:7: 错误: 'StreamSink?' 类型的值 无法从返回类型为“StreamSink<Response>?”的函数返回。
- “StreamSink”来自“dart:async”。
- “响应”来自“package:upgrade_noyelling/networking/Response.dart”(“lib/networking/Response.dart”)。
- “chuckCategories”来自“package:upgrade_noyelling/models/chuck_categories.dart”(“lib/models/chuck_categories.dart”)。_chuckListController?.sink; ^ lib/bloc/chuck_category_bloc.dart:15:7: 错误:“流”类型的值?无法从返回类型为“Stream<Response>?”的函数返回。
- “流”来自“飞镖:异步”。
- “响应”来自“package:upgrade_noyelling/networking/Response.dart”(“lib/networking/Response.dart”)。
- “chuckCategories”来自“package:upgrade_noyelling/models/chuck_categories.dart”(“lib/models/chuck_categories.dart”)。_chuckListController?.stream; ^
下面是代码
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();
}
}
解决方案
我在升级到 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 上也因为它不会为空
推荐阅读
- docusignapi - DocuSign API - 在日期范围内列出状态更改为“已完成”的信封
- javascript - 如何使用javascript分隔数字?
- java - msf4j 响应图像得到了不正确的关闭变量
- c# - ASP.NET MVC 5 不更新表行并发送详细信息(带有数据表)
- git - 具有大量图像的机器学习数据集的版本控制?
- laravel-5 - 使用 Carbon 我得到“找不到文本月份”错误
- java - 如何从android中的文本中提取所有URL
- java - 如何在树莓派板上使用 java sound api?
- c++ - 如果找到,则尝试输出所有索引值
- android - Android FCM:当应用收到通知时在后台调用API