Flutter本地存储插件easy_storage的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter本地存储插件easy_storage的使用

概述

easy_storage 插件并不是用于Flutter本地存储,根据提供的内容,该插件主要是为了简化与 Firebase Storage 的交互,包括文件上传、删除、进度跟踪等操作。但按照您的要求,我们将基于此创建一个关于如何在 Flutter 中进行本地存储的指南,并提供完整的示例代码。

如果您确实需要了解 easy_storage 与 Firebase Storage 的交互,请参考原内容中的详细说明。这里我们假设您是想了解如何在 Flutter 应用中实现本地数据存储的功能。

对于Flutter本地存储,常用的方式有以下几种:

  • SharedPreferences:适合存储简单的小型数据,如设置选项或用户偏好。
  • SQLite:适合需要关系型数据库支持的应用场景。
  • Hive:轻量级的NoSQL数据库,适合存储结构化数据。
  • Path_provider + File I/O:适合存储大文件或者自定义格式的数据。

接下来,我们将以 shared_preferenceshive 为例来展示如何在Flutter项目中实现本地存储功能。

使用SharedPreferences进行简单的键值对存储

安装

首先,在pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.15

然后执行flutter pub get命令安装依赖。

示例代码

下面是一个简单的例子,演示了如何保存和读取字符串类型的值:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SharedPreferences Demo',
      home: SharedPreferencesDemo(),
    );
  }
}

class SharedPreferencesDemo extends StatefulWidget {
  @override
  _SharedPreferencesDemoState createState() => _SharedPreferencesDemoState();
}

class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
  final TextEditingController _controller = TextEditingController();
  String _savedValue = '';

  Future<void> _saveData(String value) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString('key', value);
    setState(() {
      _savedValue = value;
    });
  }

  Future<void> _loadData() async {
    final prefs = await SharedPreferences.getInstance();
    final value = prefs.getString('key') ?? '';
    setState(() {
      _savedValue = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(labelText: 'Enter something to save'),
            ),
            ElevatedButton(
              onPressed: () => _saveData(_controller.text),
              child: Text('Save Data'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _loadData,
              child: Text('Load Data'),
            ),
            SizedBox(height: 20),
            Text('Loaded Value: $_savedValue'),
          ],
        ),
      ),
    );
  }
}

使用Hive进行复杂数据结构的存储

安装

同样地,在pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  hive: ^2.0.4
  hive_flutter: ^1.1.0
dev_dependencies:
  build_runner: ^2.1.7
  hive_generator: ^1.1.0

运行flutter pub get来安装这些包。同时还需要初始化Hive并打开Box,这通常放在应用启动时完成。

初始化Hive

main.dart中添加如下代码:

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

Future<void> main() async {
  // Initialize Hive
  await Hive.initFlutter();

  // Open a box for storing data
  var box = await Hive.openBox('myBox');

  runApp(MyApp(box: box));
}

class MyApp extends StatelessWidget {
  final Box box;

  MyApp({required this.box});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Hive Demo',
      home: HomeScreen(box: box),
    );
  }
}

创建模型类(可选)

如果要存储更复杂的对象,可以创建一个模型类并注册它。例如:

part 'person.g.dart';

@HiveType(typeId: 0)
class Person {
  @HiveField(0)
  String name;

  @HiveField(1)
  int age;

  Person({required this.name, required this.age});
}

记得生成代码(使用build_runner):

flutter pub run build_runner build

示例代码

接下来是具体的页面逻辑:

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

class HomeScreen extends StatefulWidget {
  final Box box;

  HomeScreen({required this.box});

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _ageController = TextEditingController();

  void _addPerson() {
    final name = _nameController.text;
    final age = int.tryParse(_ageController.text) ?? 0;

    widget.box.put('person', {'name': name, 'age': age});
    
    // Clear text fields after saving
    _nameController.clear();
    _ageController.clear();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Hive Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _nameController,
              decoration: InputDecoration(labelText: 'Name'),
            ),
            TextField(
              controller: _ageController,
              keyboardType: TextInputType.number,
              decoration: InputDecoration(labelText: 'Age'),
            ),
            ElevatedButton(
              onPressed: _addPerson,
              child: Text('Add Person'),
            ),
            SizedBox(height: 20),
            ValueListenableBuilder(
              valueListenable: widget.box.listenable(),
              builder: (context, box, _) {
                final person = box.get('person');
                return Column(
                  children: [
                    if (person != null)
                      ListTile(
                        title: Text(person['name']),
                        subtitle: Text('${person['age']} years old'),
                      ),
                    if (person == null)
                      Text('No person added yet.'),
                  ],
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

以上就是利用shared_preferenceshive两个不同的方式来进行Flutter本地存储的例子。希望这对您有所帮助!如果有任何问题或需要进一步的帮助,请随时告诉我。


更多关于Flutter本地存储插件easy_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地存储插件easy_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用easy_storage插件进行本地存储的示例代码。easy_storage是一个简单且功能强大的本地存储插件,适用于Flutter应用。

首先,你需要在pubspec.yaml文件中添加easy_storage依赖:

dependencies:
  flutter:
    sdk: flutter
  easy_storage: ^x.y.z  # 请将x.y.z替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,我们编写一个示例代码来展示如何使用easy_storage进行数据的存储和读取。

示例代码

main.dart

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Easy Storage Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final EasyStorage _storage = EasyStorage();
  String _dataFromStorage = "";
  final String _key = "example_key";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Easy Storage Example"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            TextField(
              decoration: InputDecoration(labelText: "Enter some data"),
              onSubmitted: (value) async {
                await _storage.write(_key, value);
                setState(() {
                  _dataFromStorage = value; // For demonstration, we're also setting state here
                });
                // Optionally, reload the data from storage to confirm
                String readValue = await _storage.read(_key);
                print("Data stored and read: $readValue");
              },
            ),
            SizedBox(height: 20),
            Text("Data retrieved from storage: $_dataFromStorage"),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: async () async {
                String? readValue = await _storage.read(_key);
                if (readValue != null) {
                  setState(() {
                    _dataFromStorage = readValue;
                  });
                } else {
                  setState(() {
                    _dataFromStorage = "No data found";
                  });
                }
              },
              child: Text("Load Data"),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: async () async {
                await _storage.delete(_key);
                setState(() {
                  _dataFromStorage = "Data deleted";
                });
              },
              child: Text("Delete Data"),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 添加依赖: 在pubspec.yaml中添加easy_storage依赖,并运行flutter pub get来安装它。

  2. 创建UI: 使用MaterialAppScaffold来创建一个简单的UI,包含一个TextField用于输入数据,两个ElevatedButton分别用于加载和删除数据,以及一个Text用于显示从存储中检索到的数据。

  3. 存储数据: 在TextFieldonSubmitted回调中,使用_storage.write(_key, value)将输入的数据存储到本地存储中。

  4. 读取数据: 在“Load Data”按钮的onPressed回调中,使用_storage.read(_key)从本地存储中读取数据,并更新UI。

  5. 删除数据: 在“Delete Data”按钮的onPressed回调中,使用_storage.delete(_key)删除存储的数据,并更新UI。

这个示例代码展示了如何使用easy_storage插件进行基本的本地存储操作。你可以根据需求进行扩展和修改。

回到顶部