【Flutter 面试题】Flutter如何进行本地存储和缓存数据?

【Flutter 面试题】Flutter如何进行本地存储和缓存数据?

文章目录

    • 写在前面
    • 口述回答
    • 补充说明
      • 实际案例
      • 完整代码示例
      • 运行结果
      • 详细说明

写在前面

🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2023博客之星TOP153。

👏🏻 正在学 Flutter 的同学,你好!

😊 Flutter 面试宝典是解决 Flutter 面试过程中可能出现的问题,而进行汇总整理的。一个问题一篇文章,优化答案,更适合面试过程中的口述满足实际面试需求

🔍 想解决开发中的高频零散问题?碎片化教程 👉 Flutter Tips

🔍 想深入学习 Flutter?系统化教程 👉 Flutter 从0到1 基础入门到应用上线全攻略 & 专栏指引

👥 快来和我们一起交流!👉 讨论群在这里,和大家一起进步!

口述回答

在构建 Flutter 应用时,合理选择本地存储数据缓存机制对于优化性能和提升用户体验至关重要。

以下是几种主要的本地存储技术,每种技术都适用于不同的使用场景:

  1. shared_preferences 是 Flutter 应用中实现轻量级数据持久化的标准解决方案。它主要用于存储小量的键值对数据,如用户设置或应用配置。这种方法以其简单易用和高效的性能特别适合管理简单的用户偏好

  2. sqflite,基于 SQLite 的存储方案,为 Flutter 应用提供了全功能的关系型数据库支持。它允许开发者执行 SQL 语句进行数据的增删改查操作,非常适合需要存储大量结构化数据的场景。sqflite 支持事务、批量操作和复杂查询,为数据持久化提供了强大的灵活性和扩展性。

  3. hive 以其出色的性能和直观的 API 而著称,是一个为 Dart 和 Flutter 专门设计的轻量级键值对数据库hive 支持存储复杂的数据结构,如列表和地图,且不需要事先定义模式。它特别适合需要快速读写操作的应用场景,并且可以在不同的 Flutter 平台上无缝工作。

  4. 文件存储 通过直接在设备文件系统上读写数据文件,提供了极高的灵活性。开发者可以使用 Dart 的 dart:io 库来操作文件,以存储和检索自定义格式的数据,如 JSON 文档、图片或其他二进制文件。这种方法适合于数据量大或数据结构复杂的场景,需要开发者手动管理文件的创建、读写和删除操作。

选择合适的本地存储方案需要综合考虑数据的类型、量级、访问频率以及特定平台的特性。shared_preferences 适用于轻量数据存储,sqflitehive 提供了更复杂的数据管理能力,而直接的 文件存储 则在处理大型或自定义数据时提供了最大的灵活性。

补充说明

为了帮助理解 Flutter 中的本地存储和数据缓存,我们将通过一个简单的实际案例演示如何使用 shared_preferences 来存储和检索用户设置。

实际案例

我们的目标是创建一个简单的 Flutter 应用,它允许用户通过开关控件开启或关闭某个功能,并且应用会记住用户的选择。即使应用关闭再重新打开,之前的设置也会被保留。

完整代码示例

首先,你需要在你的 pubspec.yaml 文件中添加 shared_preferences 包的依赖项:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.2.2

然后,下面是我们的 Flutter 应用代码:

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SettingsScreen(),
    );
  }
}

class SettingsScreen extends StatefulWidget {
  
  _SettingsScreenState createState() => _SettingsScreenState();
}

class _SettingsScreenState extends State<SettingsScreen> {
  bool _isFeatureEnabled = false;

  
  void initState() {
    super.initState();
    _loadSettings();
  }

  // 从 shared_preferences 加载设置
  _loadSettings() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      _isFeatureEnabled = prefs.getBool('featureEnabled') ?? false;
    });
  }

  // 更新设置并保存到 shared_preferences
  _updateSettings(bool newValue) async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      _isFeatureEnabled = newValue;
      prefs.setBool('featureEnabled', _isFeatureEnabled);
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('设置'),
      ),
      body: SwitchListTile(
        title: Text('启用某功能'),
        value: _isFeatureEnabled,
        onChanged: _updateSettings,
      ),
    );
  }
}

运行结果

当你运行这段代码时,你会看到一个包含开关控件的设置页面。用户可以通过开关控件来启用或禁用某个功能。当用户更改设置时,这个设置会被保存到 shared_preferences 中。因此,即使应用被关闭,当应用下次启动时,之前的设置也会被恢复。

image-20240320205647539

详细说明

  • 我们定义了一个 SettingsScreen StatefulWidget,因为我们需要管理设置的状态。
  • _loadSettings 方法中,我们使用 SharedPreferences.getInstance() 获取 SharedPreferences 的实例,然后通过 getBool 方法检索 'featureEnabled' 键对应的值。如果这个键不存在,我们假定该功能被禁用(即返回 false)。
  • _updateSettings 方法用于更新设置的状态,并通过 setBool 方法将新的设置值保存到 shared_preferences 中。

这个例子展示了如何使用 shared_preferences 在 Flutter 应用中进行简单的本地数据存储和检索,这对于管理用户偏好设置等轻量级数据非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474041.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式之Skywalking

Skywalking skywalking是一个apm系统&#xff0c;包含监控&#xff0c;追踪&#xff0c;并拥有故障诊断能力的 分布式系统 一、Skywalking介绍 1.什么是SkyWalking Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品&#xff0c;它同时吸收了Zipkin /Pinpoint …

力扣Lc19--- 268. 丢失的数字(java版)-2024年3月20日

1.题目描述 2.知识点 &#xff08;1&#xff09;比如数组里面有n个数&#xff0c;然后计算这n个数的总和(用等差求和数列计算&#xff09;,然后减去数组的和&#xff0c;用总和减去数组和即为所得 &#xff08;2&#xff09;加强型 for 循环&#xff08;也称为 for-each 循环&…

[C语言]指针笔试题

题一、 //结构体的大小是20个字节 struct Test{int Num;char *pcName;short sDate;char cha[2];short sBa[4];}*p;//假设p 的值为0x100000。 如下表表达式的值分别为多少&#xff1f; //已知&#xff0c;结构体Test类型的变量大小是20个字节 int main(){printf("%p\n"…

【transformer模型】一篇文章讲透

目录 引言 一、引言 二、Transformer模型的基本结构 1 编码器&#xff08;python代码片段&#xff09; 2 解码器 三、自注意力机制的工作原理 四、Transformer模型的应用场景 1 机器翻译 2 文本摘要 3 情感分析 4 语音识别 五、Transformer模型的发展现状及未来趋势…

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的&#xff1f;内存是如何分配的&#xff1f;所以我们得知道如何计算结构体的大小&#xff1f;这就引出了我们今天所要探讨的内容&#xff1a;结构体内存对齐。 1.1 对齐规…

Python利用pygame实现飞机大战游戏

文章目录&#xff1a; 一&#xff1a;运行效果 1.演示 2.思路和功能 二&#xff1a;代码 文件架构 Demo 必备知识&#xff1a;python图形化编程pygame游戏模块 一&#xff1a;运行效果 1.演示 效果图◕‿◕✌✌✌ Python利用pygame实现飞机大战游戏运行演示 参考&#x…

web集群-lvs-DR模式基本配置

目录 环境&#xff1a; 一、配置RS 1、安装常见软件 2、配置web服务 3、添加vip 4、arp抑制 二、配置LVS 1、添加vip 2、安装配置工具 3、配置DR 三、测试 四、脚本方式配置 1、LVS-DR 2、LVS-RS 环境&#xff1a; master lvs 192.168.80.161 no…

YOLOv5改进系列:新的颈部Eff-QAFPN(Efficientrep)结构助力涨点

一、论文理论 本文提出一种硬件友好的卷积神经网络结构,该结构类似于repvgg。在衡量网络效率时,经常使用Flops或者参数量,这些衡量指标对于硬件计算能力和内存带宽不敏感。因此,如何设计一个神经网络架构,使其有效地利用硬件计算能力和内存带宽是至关重要的。 论文地址:E…

Docker如何端口映射?

Docker是一种流行的开源容器化平台&#xff0c;它允许开发者将应用程序和其依赖资源打包到一个称为容器的可移植单元中。Docker提供了强大的管理和部署工具&#xff0c;使得应用程序可以在不同的环境中运行&#xff0c;无需担心环境配置的问题。在使用Docker部署应用程序时&…

【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目

本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C算法&#xff1a;滑动窗口总结 多重背包 LeetCode2902. 和带限制的子多重集合的数目 给你一个下标从 0 开始的非负整数数组 nums 和两个整数 l 和 r 。 请你…

golang常用库之-golang常用库之-ladon包 | 基于策略的访问控制

文章目录 golang常用库之-ladon包 | 基于策略的访问控制概念使用策略 条件 Conditions自定义conditionLadon Condition使用示例 持久化访问控制(Warden) 结合 Gin 开发一个简易 ACL 接口参考 golang常用库之-ladon包 | 基于策略的访问控制 https://github.com/ory/ladon Lado…

7 配置模板虚拟机

使用远程连接工具finalShell连接虚拟机后&#xff0c;接下来我们使用yum命令完成一些基础软件包的安装&#xff0c;以及将咱们新建的用户赋予管理员权限&#xff0c;最后关闭防火墙和卸载自带的JDK。 1. 安装epel-release 我们将使用yum命令进行安装&#xff0c;首先测试是否与…

海外重要行业媒体:知名服务商IntoTheBlock现已集成波场TRON网络分析数据

近日,领先链上分析服务提供商 IntoTheBlock 宣布已将波场 TRON 网络集成至其市场情报套件。该合作引发多家海外加密媒体关注,Crypto Slate、Crypto Briefing等均对此进行了报道,称此次合作意义深远,能帮助数百万用户更深入地了解波场TRON生态系统。 报道表示,波场TRON网络规模大…

AI时代Python金融大数据分析实战:ChatGPT让金融大数据分析插上翅膀

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

[pytorch] detr源码浅析

[pytorch] detr源码浅析 1. backbone部分2. encoder部分3. decoder部分4. 输出预测 为之后SAM的代码分析做铺垫 1. backbone部分 detr.py中的DETR class class DETR(nn.Module):def __init__(self, backbone, transformer, num_classes, num_queries, aux_lossFalse):...def …

适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自&#xff1a;设计模式深度解析&#xff1a;适配器模式与桥接模式-灵活应对变…

C++命名规则

如果想要有效的管理一个稍微复杂一点的体系&#xff0c;针对其中事物的一套统一、带层次结构、清晰明了的命名准则就是必不可少而且非常好用的工具。 活跃在生物学、化学、军队、监狱、黑社会、恐怖组织等各个领域内的大量有识先辈们都曾经无数次地以实际行动证明了以上公理的…

零拷贝原理+kafka中的零拷贝

零拷贝原理kafka中的零拷贝 kafka性能之零拷贝传统IO零拷贝mmp优化sendfile优化sendfile DMA scatter/gather优化Kafka是怎么使用零拷贝的 kafka性能之零拷贝 kafka中的零拷贝并不是说完全避免了上下文切换与cpu拷贝的次数, 而是减少这种拷贝次数 传统IO 传统的一次IO流程 rea…

32.768K晶振X1A000141000300适用于无人驾驶汽车电子设备

科技的发展带动电子元器件的发展电子元器件-“晶振”为现代的科技带来了巨大的贡献&#xff0c;用小小的身体发挥着大大的能量。 近两年无人驾驶汽车热度很高&#xff0c;不少汽车巨头都已入局。但这项技术的难度不小&#xff0c;相信在未来几年里&#xff0c;无人驾驶汽车这项…

【研究僧总结】回顾第1095个创作日

目录 前言一. 机缘二. 日常三. 展望 前言 感觉刚过1024不久&#xff0c;现在又来个1095创作日 一. 机缘 研究僧一直在找平台做笔记&#xff0c;方便之后的回顾总结&#xff0c;也让各位网友见证你我的成长&#xff0c;相互学习 止不住的写文止不住的成长&#xff0c;大家共同…