Flutter数据存储插件katana_storage的使用

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

Flutter数据存储插件katana_storage的使用

Masamune logo

Katana Storage

Follow on Twitter Follow on Threads Maintained with Melos

GitHub Sponsor


[GitHub] | [YouTube] | [Packages] | [Twitter] | [Threads] | [LinkedIn] | [mathru.net]


简介

文件上传功能在各种应用程序中都被广泛使用。

例如,社交网络和匹配应用可以通过上传图像文件来促进沟通。

有许多云服务允许您上传文件并使其可供您的应用程序使用,但如果您正在使用Flutter和Firestore,Firebase Storage可能是您的最佳选择。

该包实现了一个包,可以使用类似于katana_model中实现的适配器在Firebase和本地文件存储之间切换。

安装

导入以下包:

flutter pub add katana_storage

如果您使用的是Firebase Storage,请同时导入以下包:

flutter pub add katana_storage_firebase

实现

准备工作

始终将StorageAdapterScope小部件放置在应用程序根部附近。

作为参数传递一个如LocalStorageAdapterStorageAdapter

// main.dart
import 'package:flutter/material.dart';
import 'package:katana_storage/katana_storage.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return StorageAdapterScope(
      adapter: const LocalStorageAdapter(),
      child: MaterialApp(
        home: const StoragePage(),
        title: "Flutter Demo",
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
      ),
    );
  }
}

创建存储对象

首先为每个文件创建一个Storage对象。

在创建时传递描述远程相对路径的StorageQuery

由于Storage对象继承自ChangeNotifier,可以与addListener和riverpod的ChangeNotifierProvider一起使用以监控其状态。

final storage = Storage(const StorageQuery("test/file"));
class StoragePage extends StatefulWidget {
  const StoragePage({super.key});

  @override
  State<StatefulWidget> createState() => StoragePageState();
}

class StoragePageState extends State<StoragePage> {
  final storage = Storage(const StorageQuery("test/file"));
  final controller = TextEditingController();

  @override
  void initState() {
    super.initState();
    storage.addListener(_handledOnUpdate);
  }

  void _handledOnUpdate() {
    setState(() {});
  }

  @override
  void dispose() {
    super.dispose();
    storage.removeListener(_handledOnUpdate);
    storage.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("App Demo")),
      body: TextField(
        controller: controller,
        expands: true,
        textAlignVertical: TextAlignVertical.top,
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final text = controller.text;
          final bytes = Uint8List.fromList(text.codeUnits);
          await storage.uploadWithBytes(bytes);
        },
        child: const Icon(Icons.upload_file),
      ),
    );
  }
}

上传文件

以下是执行上传的方法:

  • upload:通过指定本地文件路径上传文件。
  • uploadWithBytes:通过传递字节数据直接上传。

返回值是一个StorageValue,其中存储了上传文件的远程完整路径。

final bytes = Uint8List.fromList(text.codeUnits);
final storageValue = await storage.uploadWithBytes(bytes);
print("Remote path is: ${storageValue.remote.path}");

下载文件

要下载已经上传到存储中的文件,使用download方法。

也可以指定一个相对路径,作为要保存到本地的文件的参数。

返回值是一个StorageValue,其中存储了下载文件的本地完整路径和实际数据。

在Web上不支持保存到本地文件。

final bytes = Uint8List.fromList(text.codeUnits);
final storageValue = await storage.download("file.jpg");
print("Local path is: ${storageValue.local.path}");
print("Local data is: ${storageValue.local.bytes}");

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用katana_storage插件进行数据存储的示例代码。katana_storage是一个轻量级、高性能的键值存储插件,适用于Flutter应用。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  katana_storage: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来获取依赖。

2. 初始化存储

在你的Flutter应用的入口文件(通常是main.dart)中初始化KatanaStorage

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化KatanaStorage
  final storage = KatanaStorage();
  await storage.init();

  runApp(MyApp(storage: storage));
}

class MyApp extends StatelessWidget {
  final KatanaStorage storage;

  MyApp({required this.storage});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(storage: storage),
    );
  }
}

3. 使用存储

接下来,在你的主页面或其他组件中使用KatanaStorage进行数据存储和读取。例如,在一个简单的页面组件中:

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

class MyHomePage extends StatefulWidget {
  final KatanaStorage storage;

  MyHomePage({required this.storage});

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

class _MyHomePageState extends State<MyHomePage> {
  String? _storedValue;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('KatanaStorage Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Stored Value:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              _storedValue ?? 'Not set yet',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 存储数据
                await widget.storage.setItem('exampleKey', 'Hello, KatanaStorage!');
                
                // 读取数据
                String? value = await widget.storage.getItem('exampleKey');
                setState(() {
                  _storedValue = value;
                });
              },
              child: Text('Store and Retrieve Data'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

完成上述步骤后,运行你的Flutter应用。你应该能够看到一个按钮,点击该按钮后,会将数据存储在KatanaStorage中,并读取出来显示在屏幕上。

这个示例展示了如何使用katana_storage进行基本的键值存储操作。你可以根据实际需求进一步扩展和定制存储逻辑。

回到顶部