Flutter数据存储插件pinata的使用

Flutter数据存储插件pinata的使用

Pinata API Consumer

Welcome to Flutter Pinata by Rey Docs

完美的终点站,用于通过Pinata网关使用IPFS。


什么是Pinata?

Pinata是一个NFT媒体管理服务,允许用户在其选择的区块链上托管、管理和共享任何类型的文件。作为IPFS固定服务提供商,我们专注于为技术型和非技术型创作者提供快速、简单且可靠的方式共享内容,而没有任何限制。


什么是“固定”(Pinning)?

当你在IPFS节点上“固定”数据时,你是在告诉该节点这些数据非常重要,并应将其保存下来。节点是一个连接到IPFS并存储文件的程序。

固定可以防止重要数据从你的节点中被删除。只有你自己可以控制并固定节点上的数据——你无法强制IPFS网络上的其他节点为你保存内容。因此,为了确保内容保持固定状态,你必须运行自己的IPFS节点。

一旦文件被固定到IPFS,你就完全控制如何分享、分发、货币化和共享文件。

进一步阅读:什么是IPFS固定服务


开始使用

添加依赖到pubspec.yaml文件

方法一:

...
environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  pinata:
    git: https://github.com/rey-xi/pinata.git 
...

方法二:

...
environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  pinata: ^0.0.1
...

使用

Pinata

扩展 _PinataAPI 来暴露其接口,从而可以通过Pinata在线网关与IPFS进行通信。IPFS即星际文件系统,是一种去中心化的文件存储网络。

有三种主要构造函数来访问Pinata API接口:

  • Pinata.login
  • Pinata.viaPair
  • Pinata.viaJWT

Pinata.test - 可以使用Pinata测试IPFS网络接口,由Rey提供。仅限于Rey本地空间的全功能编辑器访问。


PinataAPI

与Pinata IPFS网关API通信的接口。可用于固定和取消固定文件,以及其他Pinata数据、固定和管理服务。

IPFS即星际文件系统,是一种去中心化的文件存储网络。只有具有管理员权限的Pinata密钥才能使用Pinata管理员功能。

更多用法详见Pinata部分。

示例

var pinata = Pinata.viaPair(
  name: 'Rey Pinata',
  apiKey: 'API KEY',
  secret: 'API SECRET',
);

Pinata Key

包含完整详细信息的Pinata API密钥,包括序列号、用户ID和API密钥。此类不能直接与Pinata云网关交互。要访问Pinata API密钥接口(即 _PinataAPI),请使用 PinataKey.api

示例

void main() async {
  final key = (await Pinata.test.keys).first;
}

Pin

固定数据。一个包含典型固定详细信息的结构体。固定没有构造函数,因此无法在本地创建。通过更新更改固定元数据,通过取消固定删除它。通过 _PinataAPI.pinFromAddress 创建的固定事件数据在此包中描述为 PinJobsPinJob 仅适用于通过 _PinataAPI.pinFromAddress 创建的固定。

示例

void main() async {
  final pin = (await Pinata.test.pins).first;
}

Key Access

基于枚举构建的类,作为对Pinata API密钥的权限或访问协商。Key Access 描述了Pinata云API密钥可以访问的功能。

示例

final key = adminKey.createKey(
  name: 'My new key',
  access: [KeyAccess.admin],
);

工作示例

void main() async {
  // 初始化Pinata实例
  final pinata = Pinata.test;

  // 固定文件
  print(await pinata.pinFile(File('FILE PATH')));

  // 获取已固定的文件列表
  print(pin = await pinata.pins);

  // 更新固定名称
  print(await pin.update(name: 'New Pin'));
}

感谢

感谢您的支持!

注意:本文档和项目仍在开发中,但已经非常活跃且安全可用。


完整示例代码

以下是一个完整的示例代码,展示如何使用Pinata插件:

import 'package:file/file.dart';
import 'package:pinata/pinata.dart';

void main() async {
  // 初始化Pinata实例
  final pinata = Pinata.test;

  // 固定文件
  print(await pinata.pinFile(File('FILE PATH')));

  // 获取所有固定的文件
  final pins = await pinata.pins;
  print(pins);

  // 更新某个固定文件的名称
  if (pins.isNotEmpty) {
    final pin = pins.first;
    print(await pin.update(name: 'New Pin'));
  }
}

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

1 回复

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


Pinata 是一个用于存储和管理 IPFS(InterPlanetary File System)文件的平台。它提供了一个简单的方式来将文件上传到 IPFS 并管理这些文件。在 Flutter 中,你可以使用 Pinata 的 API 来上传和检索文件。

以下是如何在 Flutter 中使用 Pinata 的基本步骤:

1. 安装依赖

首先,你需要在 pubspec.yaml 文件中添加 http 依赖,用于发送 HTTP 请求。

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3

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

2. 获取 Pinata API 密钥

在 Pinata 网站上注册并获取你的 API 密钥。你需要 API KeyAPI Secret 来进行身份验证。

3. 创建 Pinata 服务类

创建一个 Dart 类来处理与 Pinata 的交互。

import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
import 'dart:convert';

class PinataService {
  final String apiKey;
  final String apiSecret;

  PinataService({required this.apiKey, required this.apiSecret});

  Future<String> pinFileToIPFS(File file) async {
    final uri = Uri.parse('https://api.pinata.cloud/pinning/pinFileToIPFS');

    var request = http.MultipartRequest('POST', uri)
      ..headers['pinata_api_key'] = apiKey
      ..headers['pinata_secret_api_key'] = apiSecret
      ..files.add(await http.MultipartFile.fromPath(
        'file',
        file.path,
        contentType: MediaType('image', 'jpeg'), // 根据文件类型调整
      ));

    var response = await request.send();

    if (response.statusCode == 200) {
      var responseData = await response.stream.bytesToString();
      var jsonResponse = jsonDecode(responseData);
      return jsonResponse['IpfsHash'];
    } else {
      throw Exception('Failed to pin file to IPFS');
    }
  }

  Future<String> pinJsonToIPFS(Map<String, dynamic> json) async {
    final uri = Uri.parse('https://api.pinata.cloud/pinning/pinJSONToIPFS');

    var response = await http.post(
      uri,
      headers: {
        'Content-Type': 'application/json',
        'pinata_api_key': apiKey,
        'pinata_secret_api_key': apiSecret,
      },
      body: jsonEncode(json),
    );

    if (response.statusCode == 200) {
      var jsonResponse = jsonDecode(response.body);
      return jsonResponse['IpfsHash'];
    } else {
      throw Exception('Failed to pin JSON to IPFS');
    }
  }
}

4. 使用 Pinata 服务

在你的 Flutter 应用中使用 PinataService 类来上传文件或 JSON 数据。

import 'dart:io';
import 'package:flutter/material.dart';
import 'pinata_service.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PinataExample(),
    );
  }
}

class PinataExample extends StatefulWidget {
  [@override](/user/override)
  _PinataExampleState createState() => _PinataExampleState();
}

class _PinataExampleState extends State<PinataExample> {
  final PinataService pinataService = PinataService(
    apiKey: 'YOUR_API_KEY',
    apiSecret: 'YOUR_API_SECRET',
  );

  String? ipfsHash;

  Future<void> uploadFile() async {
    final file = File('path_to_your_file');
    try {
      final hash = await pinataService.pinFileToIPFS(file);
      setState(() {
        ipfsHash = hash;
      });
    } catch (e) {
      print(e);
    }
  }

  Future<void> uploadJson() async {
    final json = {
      'name': 'Test',
      'description': 'This is a test JSON',
    };
    try {
      final hash = await pinataService.pinJsonToIPFS(json);
      setState(() {
        ipfsHash = hash;
      });
    } catch (e) {
      print(e);
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pinata Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (ipfsHash != null) Text('IPFS Hash: $ipfsHash'),
            ElevatedButton(
              onPressed: uploadFile,
              child: Text('Upload File to IPFS'),
            ),
            ElevatedButton(
              onPressed: uploadJson,
              child: Text('Upload JSON to IPFS'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部