Flutter数据存储插件katana_storage的使用
Flutter数据存储插件katana_storage的使用
Katana Storage
[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
小部件放置在应用程序根部附近。
作为参数传递一个如LocalStorageAdapter
的StorageAdapter
。
// 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
更多关于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
进行基本的键值存储操作。你可以根据实际需求进一步扩展和定制存储逻辑。