【问题标题】:Flutter type 'Future<dynamic>' is not a subtype of type 'Stream<PostModel>?'Flutter 类型“Future<dynamic>”不是“Stream<PostModel>”类型的子类型?
【发布时间】:2021-09-18 21:30:15
【问题描述】:

我正在尝试使用 bloc 和 rxdart 创建一个列表,但我收到错误类型“未来”不是“流”类型的子类型?我正在使用 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());
          },
        ),
      ],
    ),

邮政集团 使用流时可能出现错误,但我无法找到错误。

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

发布存储库

    class PostRepository {
    final postApiProvider = PostApiProvider();
    Future<PostModel> fetchAllPosts() => postApiProvider.getPostList();
    }

发布 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');
    }
  }
}

后模型

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"
    }
]

【问题讨论】:

    标签: flutter dart bloc rxdart


    【解决方案1】:

    BLoC 的基本概念是首先你必须在sink 的帮助下将数据放入流中,然后你可以在Stream 的帮助下从流中获取数据。

    在您的代码中,您将 sink 函数用作 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 或任何你想要的地方调用你的接收器函数

    bloc.fetchPosts(); /// THIS WILL TRIGGER YOUR API
    

    第二个问题是模型,它是关于数据类型的。您从 API 获得的响应是​​ List&lt;dynamic&gt;,并且您已声明 Map&lt;String, dynamic&gt;。这是不正确的。定义如下

    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;
    } 
    

    最后一件事,你忘了在 fetchPosts() 函数中返回你的模型

    Future<PostModel> fetchPosts() async {
        PostModel itemModel = await _repository.fetchAllPosts();
        _postsFetcher.sink.add(itemModel);
        return itemModel;
      }
    

    【讨论】:

    • 快速提问。如果回复是对象而不是数组怎么办?
    • 然后根据你的模型类中的Object给一个数据类型。
    • 同上但没有[],基本上是列表的细节
    • 然后使用Map&lt;String,dynamic&gt;Map&lt;dynamic,dynamic&gt; 数据类型
    猜你喜欢
    • 2021-08-18
    • 2021-02-10
    • 1970-01-01
    • 2019-08-18
    • 2021-08-12
    • 2023-03-30
    • 2020-12-09
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多