Flutter 本地存储

发布时间:2026/8/1 19:21:32
Flutter 本地存储 文章目录Flutter 本地存储SharedPreferences添加依赖获取实例写入读取删除清空SQLite添加依赖定义数据库定义数据模型DAO(数据访问对象)使用文件存储添加依赖常用目录文件操作目录操作Flutter 本地存储SharedPreferences类型键值对适应场景存放简单配置、用户偏好、Token本质SharedPreferences 本质是把键值对写到 Android 的SharedPreferences和 iOS 的NSUserDefaults添加依赖dependencies:shared_preferences:^2.2.3获取实例finalprefsawaitSharedPreferences.getInstance();写入prefs.setString(name,小明);prefs.setInt(age,18);prefs.setDouble(weight,70.5);prefs.setBool(sex,true);prefs.setStringList(address,[北京,上海,重庆]);读取finalStringnameprefs.getString(name)??;finalint ageprefs.getInt(age)??0;finaldouble weightprefs.getDouble(weight)??0;finalbool sexprefs.getBool(sex)??false;finalListStringaddressprefs.getStringList(address)??[];删除awaitprefs.remove(name);清空awaitprefs.clear();SQLite类型关系型数据库适应场景结构化业务数据、列表分页添加依赖dependencies:sqflite:^2.3.3path:^1.9.0path_provider:^2.1.4定义数据库classDBManager{staticfinalDBManagerinstanceDBManager();Database?_db;FutureDatabasegetdbasync{_db??awaitopen();return_db!;}FutureDatabaseopen()async{finalStringdirawaitgetDatabasesPath();finalStringdbPathpath.join(dir,app.db);returnopenDatabase(dbPath,version:1,onCreate:_create);}void_create(Databasedb,int version)async{finalbatchdb.batch();finalStringsql CREATE TABLE note( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, category TEXT DEFAULT DEFAULT, pinned INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ); ;batch.execute(sql);batch.execute(CREATE INDEX idx_note_category ON note(category););batch.execute(CREATE INDEX idx_note_updated_at ON note(updated_at DESC););// execute将操作添加到队列中// commit执行有操作awaitbatch.commit(noResult:true);}voidclose()async{await_db?.close();_dbnull;}}定义数据模型classNote{finalint?id;finalStringtitle;finalString?content;finalStringcategory;finalint pinned;latefinalDateTimecreatedAt;latefinalDateTimeupdatedAt;Note({this.id,requiredthis.title,this.content,this.categorydefault,this.pinned0,DateTime?createdAt,DateTime?updatedAt,}){this.createdAtcreatedAt??DateTime.now();this.updatedAtupdatedAt??DateTime.now();}MapString,Object?toMap(){return{id:id,title:title,content:content,category:category,pinned:pinned,created_at:createdAt.millisecondsSinceEpoch,updated_at:updatedAt.millisecondsSinceEpoch,};}factoryNote.fromMap(MapString,Object?map){returnNote(id:map[id]asint?,title:map[title]asString,content:map[content]asString?,category:map[category]asString,pinned:map[pinned]asint,createdAt:DateTime.fromMicrosecondsSinceEpoch(map[created_at]asint),updatedAt:DateTime.fromMicrosecondsSinceEpoch(map[updated_at]asint),);}overrideStringtoString(){returnNote{id:$id, title:$title, content:$content, category:$category, pinned:$pinned, createdAt:$createdAt, updatedAt:$updatedAt};}}DAO(数据访问对象)classNoteDao{staticfinalNoteDaoinstanceNoteDao();FutureDatabaseget_dbDBManager.instance.db;// 增FutureNoteinsert(Notenode)async{finalidawait(await_db).insert(note,node.toMap()..remove(id),conflictAlgorithm:ConflictAlgorithm.replace,);returnNote(id:id,title:node.title,content:node.content,category:node.category,pinned:node.pinned,createdAt:node.createdAt,updatedAt:node.updatedAt,);}// 删Futureintdelete(int id)async{return(await_db).delete(note,where:id?,whereArgs:[id]);}// 改Futureintupdate(int id,Stringcontent)async{return(await_db).update(note,{content:content,updated_at:DateTime.now().millisecond},where:id?,whereArgs:[id],);}// 查FutureNote?get(int id)async{finalrowsawait(await_db).query(note,where:id?,whereArgs:[id],limit:1,);returnrows.isEmpty?null:Note.fromMap(rows.first);}// 查询多条FutureListNotegetList(int page,int pageSize,{String?category,String?keyword,})async{finalListStringwhere[];finalListObject?args[];if(category!nullcategory.isNotEmpty){where.add(category?);args.add(category);}if(keyword!nullkeyword.isNotEmpty){where.add((title LIKE ? OR content LIKE ?));args.add(%${keyword}%);args.add(%${keyword}%);}finalrowsawait(await_db).query(note,where:where.isEmpty?null:where.join( AND ),whereArgs:args.isEmpty?null:args,orderBy:pinned DESC, updated_at DESC,limit:pageSize,offset:page*pageSize,);varnoteListrows.map(Note.fromMap).toList(growable:false);returnnoteList;}}使用增vardaoNoteDao();dao.insert(Note(title:日记1,content:这是日记1的内容));vardaoNoteDao();dao.insert(Note(title:日记2,content:这是日记2的内容,category:日记2的分类,pinned:1,),);删vardaoNoteDao();dao.delete(1);改vardaoNoteDao();dao.update(3,hello world);查vardaoNoteDao();varnoteawaitdao.get(3);print(note:${note});ar daoNoteDao();varlistawaitdao.getList(0,30,keyword:hello world);print(noteList:${list});文件存储path_provider是一个 Flutter 插件本身不提供文件操作功能负责获取跨平台的目录路径。因为不同操作系统、不同设备的目录结构不同手动硬编码路径会导致兼容性问题。path_provider提供了跨平台的统一 API。添加依赖dependencies:path_provider:^2.1.5常用目录// 应用文档目录存储用户数据不会被系统自动清理finalDirectorydocDirawaitgetApplicationDocumentsDirectory();// Android: /data/data/包名/app_flutter// iOS: /var/mobile/Containers/Data/Application/UUID/Documents// 应用支持目录存储持久化数据finalDirectorysupportDirawaitgetApplicationSupportDirectory();// Android: /data/data/包名/files即 context.getFilesDir()// iOS: /var/mobile/Containers/Data/Application/UUID/Library/Application Support// 应用缓存目录在空间不足是会自动清理finalDirectorycacheDirawaitgetApplicationCacheDirectory();// Android: /data/data/包名/cache// iOS: /var/mobile/Containers/Data/Application/UUID/Library/Caches// 临时目录每次应用重启可能被清理finalDirectorytmpDirawaitgetTemporaryDirectory();// Android: /data/data/包名/cache// iOS: /var/mobile/Containers/Data/Application/UUID/tmp// 下载目录finalDirectory?downloadDirawaitgetDownloadsDirectory();// Android: /storage/emulated/0/Download// macOS: ~/Downloads// 外部存储目录Android专用需要申请权限finalDirectory?externalDirawaitgetExternalStorageDirectory();// Android: /storage/emulated/0/Android/data/包名/files文件操作File文件操作Directory目录操作FileSystemEntity文件系统实体基类Platform获取操作系统信息finaldirawaitgetApplicationDocumentsDirectory();finalfileFile(${dir.path}/myfile.txt);// 写入文本awaitfile.writeAsString(hello);// 写入awaitfile.writeAsString(world,mode:FileMode.append);// 追加写入// 读取文本finalcontentawaitfile.readAsString();// 流式写入finalsinkfile.openWrite(mode:FileMode.append);sink.write(hello\n);sink.write(world\n);awaitsink.flush();awaitsink.close();// 文件信息finalstatawaitfile.stat();// 获取文件元数据print(文件大小(字节)${stat.size});print(文件修改时间${stat.modified});print(文件类型${stat.type});// 文件是否存在awaitfile.exists();// 文件移动/重命名finalnewDirDirectory(${dir.path}/abc);if(!awaitnewDir.exists()){awaitnewDir.create();}finalnewPath${newDir.path}/efg.txt;file.rename(newPath);// 文件复制file.copy(newPath);// 文件删除awaitfile.delete();目录操作// 创建目录finalparentDirawaitgetApplicationDocumentsDirectory();finalDirectorydirDirectory(${parentDir.path}/mydir);awaitdir.create();// 递归创建目录awaitdir.create(recursive:true);// 递归创建目录awaitdir.delete(recursive:true);// 支持递归删除// 展示目录内容finaldirawaitgetApplicationDocumentsDirectory();finalfilesawaitdir.list().toList();for(finalentityinfiles){print(entity:${entity});}// 深度遍历展示目录内finalfilesawaitdir.list(recursive:true).toList();for(finalentityinfiles){print(entity:${entity});}