Flutter利用Dio删除数据

简介: 本篇介绍了使用 Delete 请求删除后台数据操作,以及网络请求异常捕获处理。同时,引入了长按弹窗插件来实现列表项长按后弹出操作菜单。

前言

Dio 系列文章第二篇,之前一篇讲述了 Dio 的基本介绍和获取列表数据的实例,文章链接如下:

本篇介绍如何使用 Dio 提供的 delete 方法对接后台的删除接口。调试前需要启动后台工程,参考上一篇文章,运行后台应用(同时应准备好后台数据库数据)。

界面交互

我们需要实现长按弹出列表元素来进行删除操作,界面实现不是本篇的重点,上 pub 找了一个 FocusedMenu来实现。FocusedMenu 实现比较简单,我们只需要将列表元素使用 FocusedMenuHolder 包裹起来即可:

// dynamic_item.dart

@override
Widget build(BuildContext context) {
  return FocusedMenuHolder(
    child: Container(
      // 省略原列表元素构建代码
    ),
    onPressed: () {
      // 点击事件
      _handlePressed(context);
    },
    // 长按菜单
    menuItems: <FocusedMenuItem>[
      FocusedMenuItem(
          title: Text("查看详情"),
          trailingIcon: Icon(Icons.remove_red_eye_outlined),
          onPressed: () {
            _handlePressed(context);
          }),
      FocusedMenuItem(
        title: Text("取消"),
        trailingIcon: Icon(Icons.cancel),
        onPressed: () {},
      ),
      FocusedMenuItem(
          title: Text(
            "删除",
            style: TextStyle(color: Colors.redAccent),
          ),
          trailingIcon: Icon(
            Icons.delete,
            color: Colors.redAccent,
          ),
          onPressed: () {
            handleDelete(dynamicEntity.id);
          }),
    ],
  );
}

关键是长按菜单的配置,配置对应的菜单名称、图标、响应事件即可。这里的 handleDelete 方法从列表页面传递过来,接收一个列表元素的 id,以便在列表页面处理删除的逻辑。

网络请求删除实现

在dynamic_service.dart 中增加一个删除方法,用于网络请求删除,如下所示:

static Future delete(String id) async {
  var result = await Dio().delete(
    host + 'dynamics/' + id,
  );

  return result;
}

方法很简单,只需要调用 Dio 实例的删除方法,将需要删除的 id 拼接上 url 地址即可。

对应的调用的业务代码如下,当点击弹出菜单的删除按钮时调用该方法。该方法如果删除成功(状态码200),则从当前列表中移除该元素,并刷新状态更新界面;如果失败(状态码为其他),则通过 SnackBar 显示错误信息。

void _onItemDelete(String id) async {
    try {
      var response = await DynamicService.delete(id);
      if (response.statusCode == 200) {
        setState(() {
          _listItems.removeWhere((element) => element.id == id);
        });
      } else {
        _showErrorInfo(this.context, response.statusMessage);
      }
    } on DioError catch (e) {
      _showErrorInfo(this.context, e.message);
    } catch (e) {
      _showErrorInfo(this.context, e.toString());
    }
  }

这里首先是使用了一个 try...catch 包裹了网络请求,这是因为后台可能发生异常,例如数据已经被删除了,后台存在 bug 等等。目前我们还没有做统一对 Dio的异常进行处理,因此为了防止后台异常导致应用崩溃有必要做异常捕获。实际可以传一个虚拟的 id 验证异常,会发现Dio 会抛出一个 DioError 错误出来,这里我们可以向用户提示错误信息。

顺带讲一下 Dart 的异常捕获形式,可以看到有个on关键字,这里可以使用多个 on 来匹配不同的异常。形式如下,其中catch的第二个参数是堆栈信息。

try {
  // ...
} on ExceptionType1 catch (e) {
  // ExceptionType1异常处理
} on ExceptionType2 catch (e) {
  // ExceptionType2异常处理
} catch (e,s) {
  // 其他异常处理
}

运行效果

运行效果如下图(第二张为捕获异常的情况):

屏幕录制2021-07-03 上午11.32.48.gif屏幕录制2021-07-03 上午11.37.35.gif

源码

源码地址:https://gitee.com/island-coder/flutter-beginner/tree/master/network


欢迎关注个人公众号:岛上码农

相关文章
|
存储 Android开发 iOS开发
flutter使用dio实现 文件下载并实现进度监听总结
在flutter开发中使用dio实现 文件下载并实现进度监听
|
12天前
|
XML JSON 前端开发
一文带你了解 Flutter dio封装
一文带你了解 Flutter dio封装
|
1月前
|
存储 缓存 Dart
Flutter&鸿蒙next 封装 Dio 网络请求详解:登录身份验证与免登录缓存
本文详细介绍了如何在 Flutter 中使用 Dio 封装网络请求,实现用户登录身份验证及免登录缓存功能。首先在 `pubspec.yaml` 中添加 Dio 和 `shared_preferences` 依赖,然后创建 `NetworkService` 类封装 Dio 的功能,包括请求拦截、响应拦截、Token 存储和登录请求。最后,通过一个登录界面示例展示了如何在实际应用中使用 `NetworkService` 进行身份验证。希望本文能帮助你在 Flutter 中更好地处理网络请求和用户认证。
179 1
|
5月前
|
JSON Dart API
Flutter dio http 封装指南说明
本文介绍了如何实现一个通用、可重构的 Dio 基础类,包括单例访问、日志记录、常见操作封装以及请求、输出、报错拦截等功能。
142 2
Flutter dio http 封装指南说明
|
4月前
|
存储 缓存 安全
Flutter Dio进阶:使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新
Flutter Dio进阶:使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新
538 0
|
Dart Java 程序员
Flutter(二十一)——dio库
Flutter(二十一)——dio库
748 2
|
前端开发 数据处理
Flutter 使用 Dio 的 Post 请求增加动态
本篇介绍了新增数据页面的示例,同时对于编辑和添加的页面重复部分通过封装共用的表单组件简化了页面结构和提高复用性。
450 0
Flutter 使用 Dio 的 Post 请求增加动态
|
API
Flutter 用 Dio的 Patch请求完成数据编辑功能
本篇介绍了详情数据的获取,实体对象的部分修改来展示 Dio的 patch 请求。可以看到,Dio 提供的一系列 Restful 请求的方式基本相同,可以做到更好的封装。
305 0
Flutter 用 Dio的 Patch请求完成数据编辑功能
|
Dart NoSQL JavaScript
Flutter 网络请求王者 Dio 简介
窥一貌而知全部,作为网络请求框架, dio不仅简单易用。而且还具备强大的高级功能。本篇对dio做了基本的介绍以及获取列表数据的示例。
560 0
|
存储 JSON Dart
在 Flutter 中使用 dio【Flutter 专题 3】
在 Flutter 中使用 dio 应用程序开发的一个关键部分是优雅地处理网络请求。网络返回的响应可能包含意想不到的结果,为了获得良好的用户体验,您需要提前处理边缘情况。 关于如何使用 HTTP 包,可以看我的上一篇文章https://xie.infoq.cn/article/cdc7d247b4a5c73a6ddd797b9 在 Flutter 中使用 dio【Flutter专题3】 原文链接: https://xie.infoq.cn/article/77410f7240c3eef87f4f93a82
690 0
在 Flutter 中使用 dio【Flutter 专题 3】