Flutter 《从0到1构建大前端应用》-所有知识点架构

文章目录

  • 一丶 shared_preferences 本地存储
  • 二丶 SQLite数据库
  • 三丶 文件形式存储

一丶 shared_preferences 本地存储

导入第三方依赖: shared_preferences: ^0.5.1+1

1.shared_preferences 的常用操作

  SharedPreferences prefs = await SharedPreferences.getInstance();prefs.setString(key,value);

  SharedPreferences prefs = await SharedPreferences.getInstance();prefs.remove(key);

  SharedPreferences prefs = await SharedPreferences.getInstance();prefs.getString(key);

2.shared_preferences 举例

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';class SharedPreferencesPage extends StatefulWidget {SharedPreferencesPage({Key key, this.title}) : super(key: key);final String title;@override_SharedPreferencesPageState createState() => _SharedPreferencesPageState();
}class _SharedPreferencesPageState extends State<SharedPreferencesPage> {int _count = 0;     //数值@overridevoid initState() {      //初始化生命周期方法super.initState();_getCounter();}void _incrementCounter() async {SharedPreferences prefs = await SharedPreferences.getInstance();    //实例化 SharedPreferences对象int counter = (prefs.getInt("counter") ?? 0) + 1;   //取出值+1setState(() {   //更新页面_count = counter;});await prefs.setInt('counter', counter);   //保存值}_getCounter() async {SharedPreferences prefs = await SharedPreferences.getInstance();setState(() {_count = prefs.get('counter') ?? 0;});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('点击数:' + _count.toString(),style: Theme.of(context).textTheme.display1,),],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,     //点击悬浮按钮时tooltip: 'Increment',child: Icon(Icons.add),),);}
}

二丶 SQLite数据库

1.sqllite 依赖库简介
第三方库: sqflite: ^1.1.3

获取和删 database

在这里插入代码片

2.封装 SQL Helpers

db_helpers.dart

import 'dart:io';import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';final String tableUser = 'user';    //表名
final String columnId = '_id';      //id
final String columnName = 'name';   //用户名class User {int id;         //idString name;    //用户名Map<String, dynamic> toMap() {var map = <String, dynamic>{    //创建map数据,并赋值给用户名columnName: name,};if (id != null) {map[columnId] = id; //赋值给id}return map;}User();//从Map数据中取出对应值并赋值给实体bean的成员变量User.fromMap(Map<String, dynamic> map) {id = map[columnId];name = map[columnName];}
}class DBProvider {DBProvider._();static final DBProvider db = DBProvider._();    //数据库提供者Database _database;     //数据库Future<Database> get database async {if (_database != null) return _database;_database = await initDB();     //如果数据库不存在,则在建立table的同时创建数据库,若表存在数据库不可能不存在return _database;   //返回数据库}initDB() async {//目录对象 = 获取应用文件目录Directory documentsDirectory = await getApplicationDocumentsDirectory();//路径 = 加入(目录对象路径,表名)String path = join(documentsDirectory.path, "UserDB.db");//打开数据库(路径,版本,数据库)return await openDatabase(path, version: 1, onOpen: (db) {},onCreate: (Database db, int version) async {//创建表await db.execute('''                                        create table $tableUser ( $columnId integer primary key autoincrement, $columnName text not null)''');});}//插入数据Future<User> insert(User user) async {final db = await database;    //获取数据库对象//返回数据库存入的id = 插入(表名,Map类型(用来传入需要添加的字段名和对应的取值))user.id = await db.insert(tableUser, user.toMap());return user;    //返回bean对象}//获取单个数据Future<User> getUser(int id) async {final db = await database;    //获取数据库对象//查询List<Map> maps = await db.query(tableUser,    //表名columns: [columnId, columnName],        //查询字段where: '$columnId = ?',                 //条件whereArgs: [id]);                       //where 子句的占位符参数值if (maps.length > 0) {    //若有数据return User.fromMap(maps.first);    //从Map数据中取出对应值}return null;}//获取全部数据Future<List<User>> getAllUser() async {final db = await database;        //获取数据库对象var res = await db.query("User");   //表名List<User> list =res.isNotEmpty ? res.map((c) => User.fromMap(c)).toList() : []; //isNotEmpty 不为空return list;}//删除数据Future<int> delete(int id) async {final db = await database;     //获取数据库对象return await db.delete(tableUser, where: '$columnId = ?', whereArgs: [id]);}//更新数据Future<int> update(User user) async {final db = await database;      //获取数据库对象return await db.update(tableUser, user.toMap(),     //表名,Map<修改字段,对应值>where: '$columnId = ?', whereArgs: [user.id]);  //id = 占位符,where字句占位符所对应的值}//删除所有数据(删除表)removeAll() async {final db = await database;     //获取数据库对象db.delete(tableUser);     //删除表}//关闭资源Future close() async {final db = await database;  //获取数据库对象db.close(); //关闭}
}

3.sqllite 实现员工打卡实例

数据库封装类在上面:db_helpers.dart

CheckInPage.dart

import 'package:flutter/material.dart';
import 'package:flutter_store/check_in_result.dart';
import 'package:flutter_store/db_helpers.dart';
import 'package:shared_preferences/shared_preferences.dart';class CheckInPage extends StatefulWidget {CheckInPage({Key key, this.title}) : super(key: key);final String title;@override_CheckInPageState createState() => _CheckInPageState();
}class _CheckInPageState extends State<CheckInPage> {final TextEditingController textTitleEditingController =    //文本编辑器对象new TextEditingController();_save() {User user = User();   //实例化实体beanuser.name = textTitleEditingController.text;  //bean.用户名=得到文本编辑器的内容DBProvider.db.insert(user);   //插入数据Navigator.of(context).push(         //跳转到 CheckInResult 页面new MaterialPageRoute(builder: (context) {return new CheckInResult();},),);}_removeData() {     //清除所有数据DBProvider.db.removeAll();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(child: Column(children: <Widget>[TextField(      //文本域controller: textTitleEditingController,   //控制者autofocus: true,    //自动对焦decoration: new InputDecoration(    //装饰:输入装饰hintText: '请输入用户名',),),RaisedButton(child: Text('保存'),onPressed: _save,     //保存数据),RaisedButton(child: Text('清除数据'),onPressed: _removeData,)],)),);}
}

CheckInResult.dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_store/db_helpers.dart';class CheckInResult extends StatelessWidget {CheckInResult({Key key}) : super(key: key);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("已打卡人员")),body: FutureBuilder<List<User>>(    //未来建造者(List集合(bean对象))future: DBProvider.db.getAllUser(), //未来:得到所有数据(future类型)//上下文对象,异步数据      这个数据一定是先拿到了全部数据,才会执行下面的方法builder: (BuildContext context, AsyncSnapshot<List<User>> snapshot) {if (snapshot.hasData) {       //若数据库中有数据return ListView.builder(itemCount: snapshot.data.length,  //数据长度//每一个item:(上下文对象,  下标)itemBuilder: (BuildContext context, int index) {User item = snapshot.data[index];   //取出每一个bean对象return ListTile(title: Text(item.name), //用户名);},);} else {return Center(child: CircularProgressIndicator());    //若没数据:显示圆形进度指示器}},),);}
}

三丶 文件形式存储

1.path_provider简介

第三方库: path_provider: ^0.5.0+1

【1】获取临时目录

 Directory tempDir = await getTemporaryDirect();String tempPath = tempDir.path;

【2】获取应用文档目录

 Directory appDocDir = await getApplicationDocumentsDirectory();String appDocPath = appDocDir.path;

【3】获取外部存储目录

 Directory externalDir = await getExternalStorageDirectory();String externalPath = externalDir.path;

注意:iOS 平台上没有外部存储目录的概念,这一点在实际开发中需要注意并区分

2.一个简单的日记本示例

import 'dart:io';import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';class FileProviderPage extends StatefulWidget {final InfoStorage storage;      //信息存储final String title;             //标题FileProviderPage({Key key, this.title, this.storage}) : super(key: key);@override_FileProviderPageState createState() => _FileProviderPageState();
}class _FileProviderPageState extends State<FileProviderPage> {final TextEditingController textTitleEditingController =    //文本编辑器对象new TextEditingController();String _info;@overridevoid initState() {    //初始化生命周期函数super.initState();widget.storage.readInfo().then((String info) {  //获取指定文件数据setState(() {     //更新页面_info = info;});});}//保存Future<File> _saveInfo() async {setState(() {   //先更新页面_info = textTitleEditingController.text;});return widget.storage.writeInfo(_info);   //将新数据写入文件中}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('一个简单的日记本')),body: Column(children: <Widget>[TextField(controller: textTitleEditingController, //控制者autofocus: true,    //自动对焦decoration: new InputDecoration(    //装饰:输入装饰hintText: _info,),),RaisedButton(child: Text('保存'),onPressed: _saveInfo,),Text(_info ?? ""),],),);}
}class InfoStorage {Future<String> get _localPath async {final directory = await getApplicationDocumentsDirectory(); // 目录对象 = 得到应用文件目录return directory.path;    //目录路径}//得到本地存储文件Future<File> get _localFile async {final path = await _localPath;    //得到本地存储路径return File('$path/info.txt');  //打开文件(目录路径/文件名)}Future<String> readInfo() async {try {final file = await _localFile;    //得到本地存储对象String info = await file.readAsString();  //读取文件数据,返回值是字符串print(info);    //控制台打印return info;    //返回读取文件的字符串结果} catch (e) {return "error"; //如果有异常,则返回error}}Future<File> writeInfo(String info) async {final file = await _localFile;  //得到本地存储对象return file.writeAsString(info);  //写入数据}
}

《Flutter 从0到1构建大前端应用》读后感—第8章【持久化】相关推荐

  1. flutter从0到1构建大前端应用 pdf_前端骨架屏都是如何生成的

    作者:SHERlocked93 转发链接:https://mp.weixin.qq.com/s/j2XzwLPnalDCNaKkfjH-0Q 前言 相比于早些年前后端代码紧密耦合.后端工程师还得写前端 ...

  2. flutter从0到1构建大前端应用 pdf_推荐前端热门GitHub代码库「值得收藏」

    作者:刘小夕 前端宇宙 转发链接:https://mp.weixin.qq.com/s/Ypl3K2wVd_NrgCg_zogngA

  3. Flutter从0到1构建大前端应用(一):Dart环境配置及基础语法

    文章目录 代序 环境搭建 使用国内镜像 windowsDart环境变量配置教程 windows flutter环境变量配置教程 1.解压flutter-sdk到任意目录 2.配置flutter-sdk ...

  4. Flutter从0到1构建大前端应用(四):组件

    文章目录 前言 阅读建议 正文 MaterialApp 属性 Demo 效果展示 Scaffold 属性 Demo 效果展示 Container 基本用法 Demo 效果演示 Text 属性表: De ...

  5. 从0到1构建大促运营活动

    从0到1构建大促运营活动 前言 一.需求背景 依托流量 平台拉新 业务促活 二.需求分析 2.1 运营玩法分析 2.2 业务需求分析 2.3 领域对象识别 2.4 业务场景拆分 三.任务拆解 四.研发 ...

  6. 从0到1构建大数据生态系列1:数据蛮荒中的拓荒之举

    缘起 我们都知道,当前大数据的需求基本属于遍地开花.无论是帝都.魔都,还是广州.深圳,亦或是全国其他各地,都在搞大数据:不管是不到百人的微小公司,还是几百上千人的中型公司,亦或是上万的大型公司,都在需 ...

  7. Flutter 快速上手,秒变大前端

    简介:近两年Flutter的热度不断提升,无论在阿里还是外部公司,参与Flutter生态建设的人越来越多.Flutter作为跨端的UI框架,未来也有很大的可能像Rax一样作为集团内营销活动页面搭建的D ...

  8. 火了几年的大前端,现在怎么样了?

    大概从2017年开始,大前端这个名词开始出现,infoQ的一些技术大会也开始设置大前端议题,react native火的一塌糊涂,阿里.京东.去哪儿也开始推出自己的跨平台实践.时至今日,大前端已经发展 ...

  9. 大前端时代的乱流:带你了解最全面的 Flutter Web

    Flutter Web 稳定版本发布至今也有一年多了,经过这一年多的发展,今天就让我们来看看作为大前端时代的乱流,Flutter Web 究竟有什么不同之处,本篇分享主要内容是目前 Flutter 下 ...

  10. Flutter快学快用开篇词 通往大前端的一把关键钥匙 Flutter

    你好,欢迎来到 Flutter 课程,我是清弦. 近 10 年来,我一直在一线大厂从事 Web 前端研发工作,负责前端.中台业务以及跨端平台的研发和团队管理.目前大前端因为"一套代码,多端运 ...

最新文章

  1. 每日一皮:为了找个程序员租客,我拼了!
  2. python在财务上的应用-Python用于财务工作培训
  3. 网工协议基础(4)TCP/UDP协议
  4. 5个专注于检测和预测异常的Java工具分享
  5. linux内存管理实验malloc,linux内存管理实验报告.doc
  6. 小熊错误_新手爸妈第一年带娃时,很容易犯的7个错误,对照看看你中了没
  7. 阿里云对象存储OSS与文件存储NAS的区别
  8. Oracle redo
  9. 简历上终于可以写“精通MySQL”!
  10. GB28181-2016系统相关技术介绍
  11. 互联网公司的黑话,你都经历过吗?
  12. 3月9日 英语笔记-英标
  13. m1 mac屏幕保护程序取消不了怎么办
  14. Shell判断字符串是否为空
  15. Mac系统下编译并使用ijkplyer播放器
  16. linux常见faq,Linux--FAQ 常见的问题与解答
  17. 向日葵android客户端,向日葵安卓3.1客户端教程
  18. python word.documents.open报错_Python教程:[43]Word基本操作
  19. VB中Byval关键字的使用。
  20. java gif等比例缩放_对gif动图进行缩放等处理(java)

热门文章

  1. mysql-关联查询
  2. Package.json 属性说明
  3. 21个js 技巧收藏
  4. MySQL源码—线程篇
  5. 在内容也中寻找母板页中的控件
  6. 2021年了,Transformer有可能替代CNN吗?未来有哪些研究方向?
  7. 1024大波红包来袭,程序员们请查收
  8. 学术 | 如何写一篇合格的NLP论文
  9. NLP基础—3.文本表示
  10. 将list中的数据类型都变成int类型