Flutter本地存储插件flutter_leveldb的使用

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

Flutter本地存储插件flutter_leveldb的使用

flutter_leveldb 是一个用于在 Android 和 iOS 上构建 LevelDB 的 Flutter 插件项目。

如何构建

步骤 1

克隆 LevelDB 源项目

git submodule update --init --recursive

步骤 2

确保 Gradle 同步成功

  • 直接运行应用进行调试
  • 构建发布共享库
gradle assembleRelease

步骤 3

在哪里获取生成的 so 文件

生成的文件会放置在目录: example/build/flutter_leveldb/intermediates/cmake/debug(或 release)/obj

LevelDB 源项目

LevelDB 源项目


示例代码

以下是使用 flutter_leveldb 插件的基本示例代码:

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_leveldb/flutter_leveldb.dart';
import 'package:flutter_leveldb/leveldb.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = '未知';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用 PlatformException 进行捕获。
    // 我们还处理了消息可能返回 null 的情况。
    try {
      platformVersion = await FlutterLeveldb.platformVersion ?? '未知平台版本';
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果在异步平台消息还在飞行时小部件被从树中移除,
    // 我们希望丢弃回复而不是调用 setState 来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  void testLevelDB() async {
    // 获取临时目录
    Directory tempDir = await getTemporaryDirectory();
    String tempPath = tempDir.path;
    tempPath = path.join(tempPath, 'test.leveldb');

    // 打开 LevelDB 数据库
    final db = LevelDB.open(
      options: Options.byDefault(createIfMissing: true),
      filePath: tempPath,
    );

    // 创建键和值
    final key = Uint8List.fromList('example'.codeUnits);
    final value = Uint8List.fromList('world'.codeUnits);

    // 存储键值对
    void put() {
      final k = RawData.fromList(key);
      final v = RawData.fromList(value);
      db.put(k, v, ensured: true);
      k.dispose();
      v.dispose();
    }

    // 获取值
    String get() {
      final k = RawData.fromList(key);
      final v = db.get(k);
      final result = String.fromCharCodes(v.bytes);
      k.dispose();
      v.dispose();
      return result;
    }

    // 执行存储操作
    put();
    // 获取并打印结果
    final str = get();
    print(str);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Text('运行于: $_platformVersion\n'),
        ),
        floatingActionButton: FloatingActionButton(onPressed: testLevelDB, child: const Icon(Icons.add),),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用flutter_leveldb插件进行本地存储的示例代码。这个示例展示了如何初始化LevelDB,进行数据的写入、读取和删除操作。

首先,确保你已经在pubspec.yaml文件中添加了flutter_leveldb依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_leveldb: ^2.0.0  # 请检查最新版本号

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

接下来,是一个简单的Flutter应用示例,展示如何使用flutter_leveldb

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  LevelDB? _db;
  String? _readValue;

  @override
  void initState() {
    super.initState();
    _initDB();
  }

  Future<void> _initDB() async {
    // 初始化数据库,如果数据库目录不存在,将会自动创建
    _db = await LevelDB.open(databasesPath: 'example_db');
  }

  Future<void> _writeValue(String key, String value) async {
    if (_db != null) {
      await _db!.put(key, value);
      setState(() {}); // 更新UI
    }
  }

  Future<String?> _readValue(String key) async {
    if (_db != null) {
      String? value = await _db!.get(key);
      setState(() {
        _readValue = value;
      });
      return value;
    }
    return null;
  }

  Future<void> _deleteValue(String key) async {
    if (_db != null) {
      await _db!.delete(key);
      setState(() {}); // 更新UI
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter LevelDB Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              TextField(
                decoration: InputDecoration(labelText: 'Key'),
                onSubmitted: (key) {
                  TextField(
                    decoration: InputDecoration(labelText: 'Value'),
                    onSubmitted: (value) {
                      _writeValue(key, value);
                    },
                  ).showDialog(context);
                },
              ),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: () async {
                  String? key = await showDialog<String>(
                    context: context,
                    builder: (context) => AlertDialog(
                      title: Text('Enter Key'),
                      content: TextField(
                        decoration: InputDecoration(labelText: 'Key'),
                      ),
                      actions: [
                        TextButton(
                          onPressed: () => Navigator.of(context).pop(),
                          child: Text('Cancel'),
                        ),
                        ElevatedButton(
                          onPressed: () {
                            Navigator.of(context).pop(TextField.focusNode.primaryFocus!.textEditingValue.text);
                          },
                          child: Text('OK'),
                        ),
                      ],
                    ),
                  );
                  if (key != null) {
                    _readValue = await _readValue(key)!;
                    setState(() {}); // 更新UI
                  }
                },
                child: Text('Read Value'),
              ),
              SizedBox(height: 16),
              Text('Read Value: $_readValue'),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: () async {
                  String? key = await showDialog<String>(
                    context: context,
                    builder: (context) => AlertDialog(
                      title: Text('Enter Key'),
                      content: TextField(
                        decoration: InputDecoration(labelText: 'Key'),
                      ),
                      actions: [
                        TextButton(
                          onPressed: () => Navigator.of(context).pop(),
                          child: Text('Cancel'),
                        ),
                        ElevatedButton(
                          onPressed: () {
                            Navigator.of(context).pop(TextField.focusNode.primaryFocus!.textEditingValue.text);
                          },
                          child: Text('OK'),
                        ),
                      ],
                    ),
                  );
                  if (key != null) {
                    await _deleteValue(key);
                    _readValue = null;
                    setState(() {}); // 更新UI
                  }
                },
                child: Text('Delete Value'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// 扩展TextField,使其具有showDialog方法,用于快速显示对话框
extension TextFieldExtensions on TextField {
  Future<T?> showDialog<T>(BuildContext context) {
    return showDialog<T>(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text('Enter Value'),
          content: this,
          actions: [
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text('Cancel'),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.of(context).pop(this.controller!.text);
              },
              child: Text('OK'),
            ),
          ],
        );
      },
    );
  }
}

解释

  1. 依赖导入:在pubspec.yaml中添加flutter_leveldb依赖。
  2. 数据库初始化:在_initDB方法中初始化LevelDB数据库。
  3. 数据写入_writeValue方法将键值对存储到数据库中。
  4. 数据读取_readValue方法从数据库中读取指定键的值。
  5. 数据删除_deleteValue方法从数据库中删除指定键的值。
  6. UI界面:使用TextFieldElevatedButton构建了一个简单的界面,允许用户输入键值对、读取和删除值。

注意事项

  • 确保在实际应用中处理可能的异常,例如数据库初始化失败、读写操作失败等。
  • 本示例中的UI设计较为简单,仅用于演示目的,实际项目中可能需要更复杂的设计。

希望这个示例能够帮助你理解如何在Flutter中使用flutter_leveldb进行本地存储操作。

回到顶部