Riverpod:摄取 REST API 的简单方法

2024-01-03

我目前正在构建一个应用程序,该应用程序摄取 WordPress REST API 来显示博客文章。在初始应用程序加载时,我希望它使用一种方法提取初始数据,然后通过用户交互提取更多帖子。我目前正在进行这项工作,但是,我的实现似乎很复杂,并且可能有一种更干净的方法来完成这项工作。我的实施基于此 GitHub 问题回复 https://github.com/rrousselGit/river_pod/issues/57#issuecomment-1012366576。我的代码如下所示:

In main.dart:

final blogRepository = FutureProvider((ref) async {
  final posts = await getPosts();
  return BlogService(posts);
      },
);

final blogProvider = StateNotifierProvider<BlogService, List<BlogPost>>((ref) => throw UnimplementedError(
    "Access to a [BlogService] should be provided through a [ProviderScope]."));

In blogservice.dart:

class BlogService extends StateNotifier<List<BlogPost>> {
  final List<BlogPost> _posts;
  BlogService(this._posts) : super(_posts);
  List<BlogPost> get posts => _posts;

  Future<void> morePosts(int length) async {
    Response response;
    var dio = Dio();
    response = await dio.get('https://wordpress-site.com/wp-json/wp/v2/posts/?offset=' + length.toString());
    var posts = (response.data as List);

    state = [...state, ...posts.map((post) => BlogPost.fromJson(post)).toList()];
  }
}

Future<List<BlogPost>> getPosts() async {
  Response response;
  var dio = Dio();
  response = await dio.get('https://wordpress-site.com/wp-json/wp/v2/posts/');
  var posts = (response.data as List);

  return posts.map((post) => BlogPost.fromJson(post)).toList();

}

我认为更好的方法是使用AsyncValue但是,我无法找到任何使用此 API 的良好参考实现。


这是一个使用的示例AsyncValue- 它消除了repository

让你的 service.dart 文件像这样:

final blogServiceProvider = Provider<BlogService>((ref) => BlogService());

class BlogService {
  Future<AsyncValue<List<BlogPost>>> getBlogPost() async {
    try {
      var dio = Dio();
      Response response = await dio.get('https://wordpress-site.com/wp-json/wp/v2/posts/');
      var posts = (response.data as List);
      List<BlogPost> list  = posts.map<BlogPost>((post) => BlogPost.fromJson(post)).toList();
      return AsyncData(list);
    } catch (e) {
      return AsyncError("Something went wrong");
    }
  }
}

你的提供者就像这样:

final blogNotifierProvider = StateNotifierProvider<BlogNotifier, AsyncValue<List<BlogPost>>>((ref){
  BlogService _service = ref.read(blogServiceProvider);
  return BlogNotifier(_service);
});

class BlogNotifier extends StateNotifier<AsyncValue<List<BlogPost>>> {
  BlogNotifier(this._service) : super(AsyncLoading()) {
    getPosts();
  }
  final BlogService _service;

  void getPosts() async {
    state = await _service.getBlogPost();
  }
}



编辑:要将现有帖子与新帖子合并,请尝试以下操作:

class BlogService {

  List<BlogPost> _posts = [];

  Future<AsyncValue<List<BlogPost>>> getBlogPost() async {
    try {
      var dio = Dio();
      Response response = await dio.get('https://wordpress-site.com/wp-json/wp/v2/posts/');
      var posts = (response.data as List);
      List<BlogPost> list  = posts.map<BlogPost>((post) => BlogPost.fromJson(post)).toList();
      _posts = list;
      return AsyncData(list);
    } catch (e) {
      return AsyncError("Something went wrong");
    }
  }

    Future<AsyncValue<List<BlogPost>>> morePosts() async {
    try {
      var dio = Dio();
      Response response = await dio.get('https://wordpress-site.com/wp-json/wp/v2/posts/?offset=' + length.toString());
      var posts = (response.data as List);
      List<BlogPost> list  = posts.map<BlogPost>((post) => BlogPost.fromJson(post)).toList();
      _posts.addAll(list);
      return AsyncData(_posts);
    } catch (e) {
      return AsyncError("Something went wrong");
    }
  }
}

通知者类将是:

class BlogNotifier extends StateNotifier<AsyncValue<List<BlogPost>>> {
  BlogNotifier(this._service) : super(AsyncLoading()) {
    getPosts();
  }
  final BlogService _service;

  void getPosts() async {
    state = await _service.getBlogPost();
  }

  void morePosts() async {
    state = await _service.morePosts();
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Riverpod:摄取 REST API 的简单方法 的相关文章

随机推荐

  • Maven War 插件中的过滤

    我不明白 Maven War 插件的以下过滤器配置 有人可以向我解释一下他们在做什么吗 我已经用第一个示例和第二个示例标记了代码
  • 如何对 ExecutorService 为任务生成新线程进行单元测试?

    使用 ExecutorService 时 一个单元如何测试是否为可运行任务生成了新线程 基本上 我的应用程序有一个静态线程池 public static final ExecutorService executorService Execu
  • 如何通过管道传输或重定向curl -v 的输出?

    由于某种原因 输出总是被打印到终端 无论我是否通过 2 gt 或 gt 或 重定向它 有办法解决这个问题吗 为什么会发生这种情况 add the s 静默 选项删除进度表 然后将 stderr 重定向到 stdout 以在与响应正文相同的
  • 始终并行运行恒定数量的子进程

    我想使用子进程让编写的脚本的 20 个实例并行运行 假设我有一个包含大约 100 000 个条目的大 URL 列表 并且我的程序应该控制我的脚本的 20 个实例始终在该列表上工作 我想将其编码如下 urllist url1 url2 url
  • C++11 中的 C 风格回调

    在 C 11 项目中 我使用需要 C 风格回调的 C 风格第三方库 在我的例子中为curl 为了实现这一点 我使用了 指向成员的指针 运算符 size t c callback wrapper char ptr size t size si
  • onClick 不起作用

    我想使用 JS 将表格行转换为链接 我的它看起来像这样 tr 但是 当我尝试单击时 它并没有按照我想要的方式进入页面 事实上 点击似乎没有任何动作 有什么帮助吗 Edit 至于引用 我忘了提及我是用 PHP 来回应这一点的 这是我更新的代码
  • 外键引用同一个表

    有一次面试测试 下面是表格和结构 Table Person id name dob dod mother id father id Primary Key id Foreign Key mother id references Person
  • 在 Electron 应用程序中导航 Angular 路线时出现空白屏幕

    我目前正在使用 Electron 编写一个桌面混合应用程序 并与 AngularJS 集成进行路由等 请参阅以下角度配置 app config function routeProvider locationProvider routePro
  • 在 C# 中解析 SQL 字符串

    我需要解析一个Command CommandText 我不想运行查询 我只想看看如果执行命令 查询是否会成功 说我有 SELECT FROM SomeTable WHERE 1 1 该字符串将会成功 but SELECT FROM Some
  • 如何知道用户何时离开页面并刷新页面

    我想在用户离开页面之前进行 AJAX 调用 基本上是在离开页面之前和刷新页面之前 如何才能做到这一点 我试图用 jQuery 搜索一些东西 但没有得到任何结果 我尝试使用以下代码 window onbeforeunload function
  • mysql 查询是否可以返回 true/false 而不是值?

    我有一张桌子 custID orderID orderComponent 1 123 pizza 1 123 wings 1 234 breadsticks 1 239 salad 2 456 pizza 2 890 salad 我有一个值
  • 在构建情况下验证所属关联

    我有一个任务模型 它有很多任务 并且任务属于任务 为了安全起见 我对任务模型进行了验证 validates presence of mission id validates numericality of mission id 但问题是 当
  • IPFS:如何将文件添加到现有文件夹?

    给定一个相当大的文件夹 它已经被推送到网络 并在本地删除 如何将文件添加到该文件夹 而不重新下载整个文件夹 你只能通过使用来做到这一点ipns再次下载后ipfs get 如果它仍然固定到本地存储 那么应该会很快 1 首先将您的文件夹递归添加
  • 为什么 `vector v{{5,6}};` 有效?我以为只允许使用一对 {}?

    给定一个类A有两个构造函数 取initializer list
  • 在 C++ 中使用 SSE 将两个 32 位整数向量相乘的最快方法

    我有两个无符号向量 大小均为 4 vector
  • EPPlus 依赖循环

    从 PowerShell 安装 EPPlus 时 我得到以下信息 所有命令都是第一次运行 PackageSource Get PackageSource Name PSGallery if PackageSource IsTrusted S
  • 如何在 django 视图中将一个页面重定向到另一个页面时延迟 5 秒

    我使用了这段代码 但我想要的延迟没有实现 我希望它在那里停留至少 5 秒 from django http import HttpResponseRedirect def myview request return HttpResponse
  • mysqli_real_escape_string 安全吗?

    我是 PHP 新手 我意识到使用 php 表单 带有用户和传递文本输入 的数据库连接是完全不安全的 这是可行的 但不安全 所以 我读过有关 mysqli real escape string 的内容 并决定尝试一下
  • laravel 5.4 MIME 自定义错误消息不起作用?

    Dearest 我想为上传的图像制作自定义错误消息 这是我的控制器代码 protected function validator data validateContent messages imgUserAvatar mimes gt Fi
  • Riverpod:摄取 REST API 的简单方法

    我目前正在构建一个应用程序 该应用程序摄取 WordPress REST API 来显示博客文章 在初始应用程序加载时 我希望它使用一种方法提取初始数据 然后通过用户交互提取更多帖子 我目前正在进行这项工作 但是 我的实现似乎很复杂 并且可