Flutter IPFS集成插件vone_ipfs的使用

Flutter IPFS集成插件vone_ipfs的使用

vone_ipfs

这是一个IPFS项目。


使用步骤

1. 引入依赖

pubspec.yaml文件中添加以下依赖:

dependencies:
  vone_ipfs: ^版本号

执行flutter pub get以安装依赖。


示例代码

以下是一个完整的示例代码,展示如何在Flutter应用中集成并使用vone_ipfs插件。

import 'package:flutter/material.dart';
import 'package:vone_ipfs/bean/upload_result_entity.dart';

import 'package:vone_ipfs/component/file_upload_view.dart';
import 'package:vone_ipfs/utils/ipfs_utils.dart';
import 'package:vone_ipfs/component/image_upload_view.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> {
  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化IPFS插件,传入API密钥
    IPFSUtils.getInstance('29634358-bbca-4a69-9336-95917796e2c4');
    IPFSUtils.instance!.initUserId("root");
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('vone_ipfs 示例'),
        ),
        body: HomePage(),
      ),
    );
  }
}

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

  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final List<UploadResultEntity> _files = [];
  bool isAllowCloud = true;
  bool isFixedDir = true;
  int maxCount = 5;

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ListView(
      children: [
        // 配置部分
        Padding(
          padding: EdgeInsets.symmetric(vertical: 10),
          child: Text(
            '配置',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
        ),
        Row(
          children: [
            Text('云端'),
            Switch(
              value: isAllowCloud,
              onChanged: (value) {
                setState(() {
                  isAllowCloud = !isAllowCloud;
                });
              },
            ),
            Text('固定目录'),
            Switch(
              value: isFixedDir,
              onChanged: (value) {
                setState(() {
                  isFixedDir = !isFixedDir;
                });
              },
            ),
          ],
        ),

        // 文件上传示例
        Padding(
          padding: EdgeInsets.symmetric(vertical: 10),
          child: Text(
            '文件上传',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
        ),
        Container(
          child: FileUploadView(
            _files,
            '503',
            'vonevone',
            (files) {
              print(files);
            },
            maxCount: maxCount,
            isCanEdit: true,
            fileType: IPFSFileType.any,
            isFixedDir: isFixedDir,
            isAllowCloud: isAllowCloud,
          ),
          padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
        ),

        // 单图上传示例
        Padding(
          padding: EdgeInsets.symmetric(vertical: 10),
          child: Text(
            '单图片上传',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
        ),
        ImageUploadView(
          images: [UploadResultEntity('', '', 'fileName', 0)],
          dirName: 'vonevone',
          dirId: '503',
          isFixedDir: isFixedDir,
          placeholder: 'images/ic_pdf.png',
          isAllowCloud: isAllowCloud,
          isCanEdit: true,
          fileType: IPFSFileType.imageAndVideo,
          uploadMode: UploadMode.SINGLE,
          btnPosition: UploadBtnPosition.RIGHT,
          valueChangedCallback: (value) {
            print(value);
          },
        ),

        // 多图上传示例(顶部按钮)
        Padding(
          padding: EdgeInsets.symmetric(vertical: 10),
          child: Text(
            '多图片上传,指定顶部空间',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
        ),
        ImageUploadView(
          dirName: 'vonevone',
          dirId: '503',
          images: [],
          isCanEdit: true,
          isFixedDir: isFixedDir,
          isAllowCloud: isAllowCloud,
          uploadMode: UploadMode.MULTIPLE,
          fileType: IPFSFileType.imageAndVideo,
          maxCount: maxCount,
          btnPosition: UploadBtnPosition.TOP,
          addImageWidget: Container(
            child: Text(
              '上传',
              style: TextStyle(fontSize: 16, color: Colors.white),
            ),
            width: 200,
            height: 50,
            color: Colors.blue,
            alignment: Alignment.center,
          ),
          valueChangedCallback: (value) {
            print(value);
          },
        ),

        // 多图上传示例
        Padding(
          padding: EdgeInsets.symmetric(vertical: 10),
          child: Text(
            '多图片上传',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
        ),
        ImageUploadView(
          dirName: 'vonevone',
          dirId: '503',
          images: [],
          isCanEdit: true,
          maxCount: maxCount,
          isFixedDir: isFixedDir,
          isAllowCloud: isAllowCloud,
          uploadMode: UploadMode.MULTIPLE,
          valueChangedCallback: (value) {
            print(value);
          },
        ),
      ],
    );
  }
}

更多关于Flutter IPFS集成插件vone_ipfs的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter IPFS集成插件vone_ipfs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中集成IPFS(InterPlanetary File System)可以使用 vone_ipfs 插件。这个插件允许你在Flutter应用中与IPFS网络进行交互,例如上传文件、下载文件、获取文件内容等。

以下是如何在Flutter项目中使用 vone_ipfs 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 vone_ipfs 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  vone_ipfs: ^0.0.1  # 请检查最新版本

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

2. 初始化插件

在你的Flutter应用中,首先需要初始化 vone_ipfs 插件。

import 'package:vone_ipfs/vone_ipfs.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化IPFS
  await VoneIpfs.initialize();
  
  runApp(MyApp());
}

3. 使用插件功能

vone_ipfs 插件提供了多种功能,例如上传文件、下载文件、获取文件内容等。以下是一些常见的使用示例:

上传文件到IPFS

import 'package:vone_ipfs/vone_ipfs.dart';

Future<void> uploadFile() async {
  // 选择文件
  FilePickerResult? result = await FilePicker.platform.pickFiles();

  if (result != null) {
    File file = File(result.files.single.path!);
    
    // 上传文件到IPFS
    String? cid = await VoneIpfs.uploadFile(file);
    
    if (cid != null) {
      print('File uploaded successfully. CID: $cid');
    } else {
      print('Failed to upload file.');
    }
  } else {
    print('No file selected.');
  }
}

下载文件从IPFS

import 'package:vone_ipfs/vone_ipfs.dart';

Future<void> downloadFile(String cid) async {
  // 下载文件
  File? file = await VoneIpfs.downloadFile(cid);
  
  if (file != null) {
    print('File downloaded successfully. Path: ${file.path}');
  } else {
    print('Failed to download file.');
  }
}

获取文件内容

import 'package:vone_ipfs/vone_ipfs.dart';

Future<void> getFileContent(String cid) async {
  // 获取文件内容
  String? content = await VoneIpfs.getFileContent(cid);
  
  if (content != null) {
    print('File content: $content');
  } else {
    print('Failed to get file content.');
  }
}

4. 处理错误

在使用 vone_ipfs 插件时,可能会遇到各种错误,例如网络问题、文件不存在等。你可以使用 try-catch 块来捕获和处理这些错误。

try {
  String? cid = await VoneIpfs.uploadFile(file);
  if (cid != null) {
    print('File uploaded successfully. CID: $cid');
  } else {
    print('Failed to upload file.');
  }
} catch (e) {
  print('Error: $e');
}

5. 清理资源

在应用退出时,你可能需要清理IPFS相关的资源。

[@override](/user/override)
void dispose() {
  VoneIpfs.dispose();
  super.dispose();
}
回到顶部