Flutter内容提供插件vyuh_plugin_content_provider_sanity的使用

Flutter内容提供插件vyuh_plugin_content_provider_sanity的使用


Vyuh Logo

Vyuh框架

构建模块化、可扩展的CMS驱动Flutter应用

文档 | 网站

Vyuh内容提供插件for Sanity 🔌 #

vyuh_plugin_content_provider_sanity

一个强大的内容提供插件,无缝集成Sanity.io到Vyuh框架。此插件使您的Vyuh应用程序能够以最小的配置从Sanity.io获取、缓存和管理内容。

特性 ✨ #

  • 内容管理 📝

    • 获取单个或多个文档
    • 支持所有Sanity内容类型
    • 自动内容类型映射
    • 内置缓存,可配置持续时间
  • 资产支持 🖼️

    • 带变换的图像资产
    • 带元数据的文件资产
    • 引用处理
    • 资产缓存
  • 路由集成 🛣️

    • 从内容自动生成路由
    • 支持Vyuh框架模式
    • 动态路由参数
    • 嵌套路由处理
  • 性能

    • 高效的缓存内容
    • CDN支持
    • 优化的网络请求
    • 并行内容获取

安装 📦 #

在您的包的pubspec.yaml文件中添加以下内容:

dependencies:
  vyuh_plugin_content_provider_sanity: ^1.0.0

使用 💡 #

基本设置 #

创建并配置Sanity内容提供插件:

import 'package:vyuh_core/vyuh_core.dart' as vc;
import 'package:sanity_client/sanity_client.dart';
import 'package:vyuh_plugin_content_provider_sanity/vyuh_plugin_content_provider_sanity.dart';

final contentProvider = SanityContentProvider.withConfig(
  config: SanityConfig(
    projectId: '<project-id>',
    dataset: 'production',
    perspective: Perspective.published,  // 或者previewDrafts用于草稿内容
    useCdn: true,                       // 启用CDN以提高性能
  ),
  cacheDuration: const Duration(minutes: 5),
);

void main() async {
  vc.runApp(
    features: () => [
      // 您的功能在此
    ],
    plugins: [
      contentProvider,
      // 其他插件
    ],
  );
}

获取内容 #

// 获取单个文档
final post = await contentProvider.fetchSingle<Post>(
  '*[_type == "post" && _id == $id][0]',
  fromJson: Post.fromJson,
  queryParams: {'id': 'post-123'},
);

// 获取多个文档
final posts = await contentProvider.fetchMultiple<Post>(
  '*[_type == "post" && category == $category]',
  fromJson: Post.fromJson,
  queryParams: {'category': 'tech'},
);

// 通过ID获取
final author = await contentProvider.fetchById<Author>(
  'author-123',
  fromJson: Author.fromJson,
);

处理资产 #

// 获取用于Image小部件的ImageProvider
final imageProvider = contentProvider.image(
  ImageReference(
    asset: Asset(ref: 'image-Tb9Ew8CXIwaY6R1kjMvI0uRR-2000x3000-jpg'),
  ),
  width: 800,
  height: 600,
  devicePixelRatio: 2,
  quality: 80,
  format: 'webp',
);

// 在Image小部件中使用
if (imageProvider != null) {
  Image(image: imageProvider);
}

// 获取文件URL
final fileUrl = contentProvider.fileUrl(fileRef);

路由处理 #

// 通过路径获取路由
final route = await contentProvider.fetchRoute(
  path: '/blog/my-post',
);

// 通过ID获取路由
final route = await contentProvider.fetchRoute(
  routeId: 'route-123',
);

if (route != null) {
  // 处理路由内容
}

配置 🔧 #

内容提供器可以配置多种选项:

final provider = SanityContentProvider.withConfig(
  config: SanityConfig(
    projectId: '<project-id>',
    dataset: 'production',

    // 内容交付选项
    useCdn: true,                    // 使用CDN以提高性能
    perspective: Perspective.published, // 内容视角

    // 缓存配置
    cacheDuration: Duration(minutes: 5),

    // 可选认证
    token: '<your-token>',           // 用于访问私有数据集
  ),

  // 额外选项
  debug: true,                       // 启用调试日志
  retryOptions: RetryOptions(        // 配置重试行为
    maxAttempts: 3,
    delayFactor: Duration(seconds: 1),
  ),
);

错误处理 🚨 #

提供器包括各种场景下的适当错误处理:

try {
  final post = await contentProvider.fetchSingle<Post>(
    '*[_type == "post" && _id == $id][0]',
    fromJson: Post.fromJson,
    queryParams: {'id': 'post-123'},
  );
  // 处理文章
} on InvalidResultTypeException catch (e) {
  print('类型不匹配: 预期 ${e.expectedType}, 实际为 ${e.actualType}');
} on SanityError catch (e) {
  print('Sanity API 错误: ${e.message}');
} on Exception catch (e) {
  print('意外错误: $e');
}

// 当获取路由时
try {
  final route = await contentProvider.fetchRoute(path: '/blog/my-post');
  if (route == null) {
    print('未找到路由');
    return;
  }
  // 处理路由
} on SanityError catch (e) {
  print('获取路由时发生错误: ${e.message}');
}

更多关于Flutter内容提供插件vyuh_plugin_content_provider_sanity的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter内容提供插件vyuh_plugin_content_provider_sanity的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


vyuh_plugin_content_provider_sanity 是一个 Flutter 插件,用于在 Android 平台上与内容提供器(Content Provider)进行交互。该插件可以帮助开发者更轻松地访问和操作 Android 系统中的内容提供器数据。

以下是如何使用 vyuh_plugin_content_provider_sanity 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  vyuh_plugin_content_provider_sanity: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取插件。

2. 导入插件

在需要使用插件的 Dart 文件中导入插件:

import 'package:vyuh_plugin_content_provider_sanity/vyuh_plugin_content_provider_sanity.dart';

3. 初始化插件

在使用插件之前,通常需要对其进行初始化:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await VyuhPluginContentProviderSanity.initialize();
  runApp(MyApp());
}

4. 使用插件进行数据操作

vyuh_plugin_content_provider_sanity 插件提供了一些方法来与内容提供器进行交互。以下是一些常见的操作示例:

查询数据

Future<void> queryData() async {
  // 定义要查询的URI
  Uri uri = Uri.parse("content://com.example.provider/items");

  // 定义要查询的列
  List<String> projection = ["_id", "name", "description"];

  // 执行查询
  List<Map<String, dynamic>> result = await VyuhPluginContentProviderSanity.query(uri, projection: projection);

  // 处理查询结果
  for (var item in result) {
    print(item);
  }
}

插入数据

Future<void> insertData() async {
  // 定义要插入的URI
  Uri uri = Uri.parse("content://com.example.provider/items");

  // 定义要插入的数据
  Map<String, dynamic> values = {
    "name": "New Item",
    "description": "This is a new item"
  };

  // 执行插入
  Uri resultUri = await VyuhPluginContentProviderSanity.insert(uri, values);

  // 处理插入结果
  print("Inserted at: $resultUri");
}

更新数据

Future<void> updateData() async {
  // 定义要更新的URI
  Uri uri = Uri.parse("content://com.example.provider/items/1");

  // 定义要更新的数据
  Map<String, dynamic> values = {
    "name": "Updated Item",
    "description": "This item has been updated"
  };

  // 执行更新
  int rowsUpdated = await VyuhPluginContentProviderSanity.update(uri, values);

  // 处理更新结果
  print("Rows updated: $rowsUpdated");
}

删除数据

Future<void> deleteData() async {
  // 定义要删除的URI
  Uri uri = Uri.parse("content://com.example.provider/items/1");

  // 执行删除
  int rowsDeleted = await VyuhPluginContentProviderSanity.delete(uri);

  // 处理删除结果
  print("Rows deleted: $rowsDeleted");
}

5. 处理权限

在访问某些内容提供器时,可能需要特定的权限。确保在 AndroidManifest.xml 文件中声明所需的权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

6. 处理异常

在使用插件时,可能会遇到各种异常情况,因此建议在代码中添加适当的异常处理:

try {
  await queryData();
} catch (e) {
  print("Error querying data: $e");
}
回到顶部