Flutter 类型 'Future<dynamic>' 不是类型 'Stream<PostModel>?' 的子类型
Flutter type 'Future<dynamic>' is not a subtype of type 'Stream<PostModel>?'
我正在尝试使用 bloc 和 rxdart 创建列表,但出现错误类型 'Future' 不是类型 'Stream?' 的子类型 我正在使用 rxdart:^0.27.1。只想将 数组响应 放入列表中。
我的列表屏幕
Column(
children: [
StreamBuilder(
stream: bloc.fetchPosts(),
builder: (context, AsyncSnapshot<PostModel> snapshot) {
if (snapshot.hasData) {
return buildList(snapshot);
} else if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
return Center(child: CircularProgressIndicator());
},
),
],
),
Post集团集团
可能是在使用流时出现错误,但我找不到错误。
class PostBloc {
final _repository = PostRepository();
final _postsFetcher = PublishSubject<PostModel>();
Stream<PostModel> get allPosts => _postsFetcher.stream;
fetchPosts() async {
PostModel itemModel = await _repository.fetchAllPosts();
_postsFetcher.sink.add(itemModel);
}
dispose() {
_postsFetcher.close();
}
}
final bloc = PostBloc();
Post 存储库
class PostRepository {
final postApiProvider = PostApiProvider();
Future<PostModel> fetchAllPosts() => postApiProvider.getPostList();
}
Post ApiProvider
class PostApiProvider {
Client client = Client();
Future<PostModel> getPostList() async {
print("entered");
final response = await client
.get(Uri.parse("https://jsonplaceholder.typicode.com/posts"));
print(response.body.toString());
if (response.statusCode == 200) {
return PostModel.fromJson(json.decode(response.body));
} else {
// If that call was not successful, throw an error.
throw Exception('Failed to load post');
}
}
}
Post型号
class Post {
late int userId;
late int id;
late String title;
late String body;
Post(result) {
userId = result['userId'];
id = result['id'];
title = result['title'];
body = result['body'];
}
int get getUserID => userId;
int get getID => id;
String get getTitle => title;
String get getBody => body;
}
class PostModel {
List<Post> results = [];
PostModel.fromJson(Map<String, dynamic> parsedJson) {
List<Post> temp = [];
for (int i = 0; i < parsedJson.length; i++) {
Post result = Post(parsedJson[i]);
temp.add(result);
}
results = temp;
}
List<Post> get getResults => results;
}
示例响应
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
]
BLoC
的基本概念是首先你必须在 sink
的帮助下将数据放入流中,然后你可以在 Stream
的帮助下从流中获取数据。
在您的代码中,您将接收函数用作 StreamBuilder's
流。这是不正确的。你应该像下面这样调用流,
StreamBuilder(
stream: bloc.allPosts, /// THIS IS STREAM OF DATA
builder: (context, AsyncSnapshot<PostModel> snapshot) {
if (snapshot.hasData) {
return buildList(snapshot);
} else if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
return Center(child: CircularProgressIndicator());
},
);
像这样在 initState 或任何你想要的地方调用你的 sink 函数
bloc.fetchPosts(); /// THIS WILL TRIGGER YOUR API
第二期是模型,是关于数据类型的。您从 API 得到的响应是 List<dynamic>
并且您已声明 Map<String, dynamic>
。这是不正确的。定义如下
class PostModel {
List<Post> results = [];
PostModel.fromJson(List<dynamic> parsedJson) {
List<Post> temp = [];
for (int i = 0; i < parsedJson.length; i++) {
Post result = Post(parsedJson[i]);
temp.add(result);
}
results = temp;
}
List<Post> get getResults => results;
}
最后一件事,您忘记 return 您的模型在 fetchPosts()
函数中
Future<PostModel> fetchPosts() async {
PostModel itemModel = await _repository.fetchAllPosts();
_postsFetcher.sink.add(itemModel);
return itemModel;
}
我正在尝试使用 bloc 和 rxdart 创建列表,但出现错误类型 'Future' 不是类型 'Stream?' 的子类型 我正在使用 rxdart:^0.27.1。只想将 数组响应 放入列表中。
我的列表屏幕
Column(
children: [
StreamBuilder(
stream: bloc.fetchPosts(),
builder: (context, AsyncSnapshot<PostModel> snapshot) {
if (snapshot.hasData) {
return buildList(snapshot);
} else if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
return Center(child: CircularProgressIndicator());
},
),
],
),
Post集团集团 可能是在使用流时出现错误,但我找不到错误。
class PostBloc {
final _repository = PostRepository();
final _postsFetcher = PublishSubject<PostModel>();
Stream<PostModel> get allPosts => _postsFetcher.stream;
fetchPosts() async {
PostModel itemModel = await _repository.fetchAllPosts();
_postsFetcher.sink.add(itemModel);
}
dispose() {
_postsFetcher.close();
}
}
final bloc = PostBloc();
Post 存储库
class PostRepository {
final postApiProvider = PostApiProvider();
Future<PostModel> fetchAllPosts() => postApiProvider.getPostList();
}
Post ApiProvider
class PostApiProvider {
Client client = Client();
Future<PostModel> getPostList() async {
print("entered");
final response = await client
.get(Uri.parse("https://jsonplaceholder.typicode.com/posts"));
print(response.body.toString());
if (response.statusCode == 200) {
return PostModel.fromJson(json.decode(response.body));
} else {
// If that call was not successful, throw an error.
throw Exception('Failed to load post');
}
}
}
Post型号
class Post {
late int userId;
late int id;
late String title;
late String body;
Post(result) {
userId = result['userId'];
id = result['id'];
title = result['title'];
body = result['body'];
}
int get getUserID => userId;
int get getID => id;
String get getTitle => title;
String get getBody => body;
}
class PostModel {
List<Post> results = [];
PostModel.fromJson(Map<String, dynamic> parsedJson) {
List<Post> temp = [];
for (int i = 0; i < parsedJson.length; i++) {
Post result = Post(parsedJson[i]);
temp.add(result);
}
results = temp;
}
List<Post> get getResults => results;
}
示例响应
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
]
BLoC
的基本概念是首先你必须在 sink
的帮助下将数据放入流中,然后你可以在 Stream
的帮助下从流中获取数据。
在您的代码中,您将接收函数用作 StreamBuilder's
流。这是不正确的。你应该像下面这样调用流,
StreamBuilder(
stream: bloc.allPosts, /// THIS IS STREAM OF DATA
builder: (context, AsyncSnapshot<PostModel> snapshot) {
if (snapshot.hasData) {
return buildList(snapshot);
} else if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
return Center(child: CircularProgressIndicator());
},
);
像这样在 initState 或任何你想要的地方调用你的 sink 函数
bloc.fetchPosts(); /// THIS WILL TRIGGER YOUR API
第二期是模型,是关于数据类型的。您从 API 得到的响应是 List<dynamic>
并且您已声明 Map<String, dynamic>
。这是不正确的。定义如下
class PostModel {
List<Post> results = [];
PostModel.fromJson(List<dynamic> parsedJson) {
List<Post> temp = [];
for (int i = 0; i < parsedJson.length; i++) {
Post result = Post(parsedJson[i]);
temp.add(result);
}
results = temp;
}
List<Post> get getResults => results;
}
最后一件事,您忘记 return 您的模型在 fetchPosts()
函数中
Future<PostModel> fetchPosts() async {
PostModel itemModel = await _repository.fetchAllPosts();
_postsFetcher.sink.add(itemModel);
return itemModel;
}