Flutter核心技术与实战
陈航
美团点评高级技术专家
立即订阅
6150 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (3讲)
开篇词 | 为什么每一位大前端从业者都应该学习Flutter?
免费
01 | 预习篇 · 从0开始搭建Flutter工程环境
02 | 预习篇 · Dart语言概览
Flutter开发起步 (3讲)
03 | 深入理解跨平台方案的历史发展逻辑
04 | Flutter区别于其他方案的关键技术是什么?
05 | 从标准模板入手,体会Flutter代码是如何运行在原生系统上的
Dart语言基础 (3讲)
06 | 基础语法与类型变量:Dart是如何表示信息的?
07 | 函数、类与运算符:Dart是如何处理信息的?
08 | 综合案例:掌握Dart核心特性
Flutter基础 (13讲)
09 | Widget,构建Flutter界面的基石
10 | Widget中的State到底是什么?
11 | 提到生命周期,我们是在说什么?
12 | 经典控件(一):文本、图片和按钮在Flutter中怎么用?
13 | 经典控件(二):UITableView/ListView在Flutter中是什么?
14 | 经典布局:如何定义子控件在父容器中排版的位置?
15 | 组合与自绘,我该选用何种方式自定义Widget?
16 | 从夜间模式说起,如何定制不同风格的App主题?
17 | 依赖管理(一):图片、配置和字体在Flutter中怎么用?
18 | 依赖管理(二):第三方组件库在Flutter中要如何管理?
19 | 用户交互事件该如何响应?
20 | 关于跨组件传递数据,你只需要记住这三招
21 | 路由与导航,Flutter是这样实现页面切换的
Flutter进阶 (17讲)
22 | 如何构造炫酷的动画效果?
23 | 单线程模型怎么保证UI运行流畅?
24 | HTTP网络编程与JSON解析
25 | 本地存储与数据库的使用和优化
26 | 如何在Dart层兼容Android/iOS平台特定实现?(一)
27 | 如何在Dart层兼容Android/iOS平台特定实现?(二)
28 | 如何在原生应用中混编Flutter工程?
29 | 混合开发,该用何种方案管理导航栈?
30 | 为什么需要做状态管理,怎么做?
31 | 如何实现原生推送能力?
32 | 适配国际化,除了多语言我们还需要注意什么?
33 | 如何适配不同分辨率的手机屏幕?
34 | 如何理解Flutter的编译模式?
35 | Hot Reload是怎么做到的?
36 | 如何通过工具链优化开发调试效率?
37 | 如何检测并优化Flutter App的整体性能表现?
38 | 如何通过自动化测试提高交付质量?
Flutter综合应用 (6讲)
39 | 线上出现问题,该如何做好异常捕获与信息采集?
40 | 衡量Flutter App线上质量,我们需要关注这三个指标
41 | 组件化和平台化,该如何组织合理稳定的Flutter工程结构?
42 | 如何构建高效的Flutter App打包发布环境?
43 | 如何构建自己的Flutter混合开发框架(一)?
44 | 如何构建自己的Flutter混合开发框架(二)?
结束语 (1讲)
结束语 | 勿畏难,勿轻略
特别放送 (1讲)
特别放送 | 温故而知新,与你说说专栏的那些思考题
Flutter核心技术与实战
登录|注册

25 | 本地存储与数据库的使用和优化

陈航 2019-08-24
你好,我是陈航。
在上一篇文章中,我带你一起学习了 Flutter 的网络编程,即如何建立与 Web 服务器的通信连接,以实现数据交换,以及如何解析结构化后的通信信息。
其中,建立通信连接在 Flutter 中有三种基本方案,包括 HttpClient、http 与 dio。考虑到 HttpClient 与 http 并不支持复杂的网络请求行为,因此我重点介绍了如何使用 dio 实现资源访问、接口数据请求与提交、上传及下载文件、网络拦截等高级操作。
而关于如何解析信息,由于 Flutter 并不支持反射,因此只提供了手动解析 JSON 的方式:把 JSON 转换成字典,然后给自定义的类属性赋值即可。
正因为有了网络,我们的 App 拥有了与外界进行信息交换的通道,也因此具备了更新数据的能力。不过,经过交换后的数据通常都保存在内存中,而应用一旦运行结束,内存就会被释放,这些数据也就随之消失了。
因此,我们需要把这些更新后的数据以一定的形式,通过一定的载体保存起来,这样应用下次运行时,就可以把数据从存储的载体中读出来,也就实现了数据的持久化
数据持久化的应用场景有很多。比如,用户的账号登录信息需要保存,用于每次与 Web 服务验证身份;又比如,下载后的图片需要缓存,避免每次都要重新加载,浪费用户流量。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Flutter核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(8)

  • 许童童
    思考题:
    1.文件用来存储图片,视频类的大文件,SharedPreferences 用来存储一些键值对,比如记住用户名,数据库用来存储类似表格有关系的数据行。
    2.
    //1.1 版本数据库创建代码
    final Future<Database> database = openDatabase(
      join(await getDatabasesPath(), 'students_database.db'),
      onCreate: (db, version)=> {
        if (version == '1.0') {
          db.execute("ALTER TABLE students ADD age INTEGER)"),
        } else {
          db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER, age INTEGER)"),
        }
      }
      version: 1,
    );

    //1.2 版本数据库创建代码
    final Future<Database> database = openDatabase(
      join(await getDatabasesPath(), 'students_database.db'),
      onCreate: (db, version)=> {
        if (version == '1.0') {
          db.execute("ALTER TABLE students ADD age INTEGER)"),
        } else if (version == '1.1') {
          
        } else {
          db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER, age INTEGER)"),
        }
      }
      version: 1,
    );

    作者回复: 数据库创建的语句不对:
    1.1.0,1.1和1.2传入的version完全一样,没办法区分数据库版本
    2.数据库升级的代码不太适合用if-else判断具体版本去写适配策略,版本一多适配代码就乱了。建议用none break的switch-case去写

    2019-08-24
    1
  • Geek_neterM
    老师,是不是我本地没有content.txt,一直报 no such file or directory

    作者回复: 检查一下你的路径名是不是和例子一样哈

    2019-09-09
  • Geek_neterM
    老师,是不是实现必须把content.txt 创建好呀。

    作者回复: 不需要的

    2019-09-09
  • Geek_joestar
    1.1 版本及 1.2 版本的数据库升级代码:
    final Future<Database> database = openDatabase(
          join(await getDatabasesPath(), 'students_database.db'),
          onCreate: (db, version) => db.execute(
              "CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER, age INTEGER)"),
          onUpgrade: (db, oldVersion, newVersion) {
            //dosth for migration
            print("old:$oldVersion,new:$newVersion");
            switch (oldVersion) {
              case 1:
                db.execute("ALTER TABLE students ADD age INTEGER");
            }
          },
          version: 2,
        );

    作者回复: 对,不过switch-case是需要有break的

    2019-09-09
  • ptlCoder
    数据库升级应该要比较两个版本的字段,防止数据丢失应该把旧的字段值拷贝到新的版本中

    作者回复: 数据量大的话不建议拷贝,建议直接在原始表上新增字段

    2019-08-29
  • 小水滴
    final Future<Database> database_1v = openDatabase(
        join(await getDatabasesPath(),'students_database.db'),
        onCreate: (db,version)=>db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER)"),
        version: 1
      );

     
      //1.1版本
      final Future<Database> database_11v = openDatabase(
          join(await getDatabasesPath(),'students_database.db'),
          onCreate: (db,version) {
            switch(version){
              case 1:
                db.execute("ALTER TABLE students ADD age INTEGER)");
                break;
              default:
                db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER , age INTEGER");
            }

          },
          version: 11
      );

      //1.1版本
      final Future<Database> database_12v = openDatabase(
          join(await getDatabasesPath(),'students_database.db'),
          onCreate: (db,version) {
            switch(version){
              case 1:
                db.execute("ALTER TABLE students ADD age INTEGER)");
                break;
              case 11:
                break;
              default:
                db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER , age INTEGER");
            }

          },
          version: 12
      );

    作者回复: 这里有一个bug:你这里的switch-case只能执行单条更新语句,如果数据库版本差的比较多,每个版本都有更新,这样就不行了


    另外更正一个原文中的错误:数据库的升级是在onUpgrade回调函数中完成的

    2019-08-28
  • davidzhou
    老师,flutter的sqlite有没有ORM的相关第三方库

    作者回复: pub上有一些,没有特别好用的,不建议

    2019-08-26
  • 汪帅
    我想请问一下关于获取系统信息怎么做啊?例如通讯录,安装的APP信息等等

    作者回复: 需要在原生代码宿主写方法通道来实现了。具体可以参考26节的内容

    2019-08-24
    3
收起评论
8
返回
顶部