Flutter Shadertoy与SQLite集成插件shadertoy_sqlite的使用

Flutter Shadertoy与SQLite集成插件shadertoy_sqlite的使用

shadertoy_sqlite

shadertoy_sqlite 是一个基于 SQLite 的 Shadertoy 存储实现,使用了 drift 包。

Pub Package
Coverage Status
Package Documentation
GitHub License


Overview

此包通过 drift 包实现了 shadertoy 包中定义的存储 API,并将其存储在 SQLite 数据库中。


Getting Started

pubspec.yaml 中添加以下依赖项:

dependencies:
    shadertoy_sqlite: ^x.x.x

运行以下命令以安装依赖项:

dart pub get

最后,导入库以开始开发:

import 'package:shadertoy_sqlite/shadertoy_sqlite.dart';

Usage

要创建一个新的存储实例,需要实例化 ShadertoyStore。以下是一个使用内存执行器(主要用于测试)的示例:

final store = newShadertoySqliteStore(VmDatabase.memory(logStatements: logStatements));

更实际的例子是创建一个基于文件的数据库:

final store = newShadertoyDriftStore(VmDatabase(File('shadertoy.db')))

这允许执行持久操作,例如保存着色器定义:

final shader = Shader(...);
final ssr = await store.saveShader(shader);
if (ssr.ok) {
    print('Shader stored');
} else {
    print('Error: ${response.error.message}');
}

以下是一个完整的示例:

import 'package:drift/ffi.dart';
import 'package:drift/drift.dart';
import 'package:shadertoy/shadertoy_api.dart';
import 'package:shadertoy_sqlite/shadertoy_sqlite.dart';

// 内存执行器
QueryExecutor memoryExecutor({bool logStatements = false}) {
  return VmDatabase.memory(logStatements: logStatements);
}

// 文件执行器
QueryExecutor diskExecutor({bool logStatements = false}) {
  return VmDatabase(File('shadertoy.db'), logStatements: logStatements);
}

void main(List<String> arguments) async {
  // 创建一个带有内存执行器的新存储
  final store = newShadertoySqliteStore(memoryExecutor());

  // 创建用户 1
  final userId1 = 'UzZ0Z1';
  final user1 = User(
      id: userId1,
      about: '关于用户 1',
      memberSince: DateTime.now());
  await store.saveUser(user1);

  // 获取用户 1
  await store.findUserById(userId1);

  // 创建用户 2
  final userId2 = 'UzZ0Z2';
  final user2 = User(
      id: userId2,
      about: '关于用户 2',
      memberSince: DateTime.now());
  await store.saveUser(user2);

  // 获取用户 2
  await store.findUserById(userId2);

  // 创建一个具有两个渲染通道的着色器
  final shaderId1 = 'SzZ0Zz';
  final shader1 = Shader(
      version: '0.1',
      info: Info(
          id: shaderId1,
          date: DateTime.fromMillisecondsSinceEpoch(1360495251),
          views: 131083,
          name: '示例',
          userId: userId1,
          description: '一个着色器示例',
          likes: 570,
          privacy: ShaderPrivacy.publicApi,
          flags: 32,
          tags: [
            '程序化',
            '3D',
            '光线追踪',
            '距离场',
            '地形',
            '运动模糊',
            'VR'
          ],
          hasLiked: false),
      renderPasses: [
        RenderPass(
            name: '图像',
            type: RenderPassType.image,
            description: '',
            code: 'code 0',
            inputs: [
              Input(
                  id: '257',
                  src: '/media/previz/buffer00.png',
                  type: InputType.texture,
                  channel: 0,
                  sampler: Sampler(
                      filter: FilterType.linear,
                      wrap: WrapType.clamp,
                      vflip: true,
                      srgb: true,
                      internal: 'byte'),
                  published: 1)
            ],
            outputs: [
              Output(id: '37', channel: 0)
            ]),
        RenderPass(
            name: '缓冲区 A',
            type: RenderPassType.buffer,
            description: '',
            code: 'code 1',
            inputs: [
              Input(
                  id: '17',
                  src: '/media/a/zs098rere0323u85534ukj4.png',
                  type: InputType.texture,
                  channel: 0,
                  sampler: Sampler(
                      filter: FilterType.mipmap,
                      wrap: WrapType.repeat,
                      vflip: false,
                      srgb: false,
                      internal: 'byte'),
                  published: 1)
            ],
            outputs: [
              Output(id: '257', channel: 0)
            ])
      ]);

  // 保存着色器
  await store.saveShader(shader1);

  // 获取已保存的着色器
  await store.findShaderById(shaderId1);

  // 创建第一个评论
  final comment1 = Comment(
      id: 'CaA0A1',
      shaderId: shaderId1,
      userId: userId2,
      picture: '/img/profile.jpg',
      date: DateTime.now(),
      text: '很棒的着色器!');

  // 创建第二个评论
  final comment2 = Comment(
      id: 'CaA0A2',
      shaderId: shaderId1,
      userId: userId1,
      picture: '/img/profile.jpg',
      date: DateTime.now(),
      text: '谢谢');

  // 保存着色器评论
  await store.saveShaderComments([comment1, comment2]);

  // 获取着色器评论
  await store.findCommentsByShaderId(shaderId1);

  // 创建播放列表
  final playlistId1 = 'week';
  final playlist1 = Playlist(
      id: playlistId1,
      userId: 'shadertoy',
      name: '每周着色器',
      description: '包含每周所有着色器的播放列表。');

  // 保存播放列表
  await store.savePlaylist(playlist1);

  // 获取播放列表
  await store.findPlaylistById(playlistId1);

  // 将着色器存储到播放列表中
  await store.savePlaylistShaders(playlistId1, [shaderId1]);

  // 获取播放列表中的着色器 ID
  await store.findShaderIdsByPlaylistId(playlistId1);
}

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

1 回复

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


在Flutter中,如果你想将Shadertoy与SQLite集成,可以使用一个自定义的插件或库来实现。假设你已经有一个名为shadertoy_sqlite的插件,以下是如何在Flutter项目中使用它的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  shadertoy_sqlite: ^1.0.0  # 请根据实际情况替换版本号

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

2. 初始化SQLite数据库

在使用SQLite之前,你需要初始化数据库。通常,你可以在应用的main函数中完成这个操作。

import 'package:shadertoy_sqlite/shadertoy_sqlite.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化SQLite数据库
  await ShadertoySqlite.initialize();
  
  runApp(MyApp());
}

3. 使用Shadertoy与SQLite

假设shadertoy_sqlite插件提供了将Shadertoy着色器数据存储到SQLite数据库的功能,你可以按照以下步骤使用它。

3.1 存储Shadertoy着色器数据

import 'package:shadertoy_sqlite/shadertoy_sqlite.dart';

Future<void> saveShader(ShaderData shader) async {
  await ShadertoySqlite.insertShader(shader);
}

3.2 获取Shadertoy着色器数据

import 'package:shadertoy_sqlite/shadertoy_sqlite.dart';

Future<List<ShaderData>> getShaders() async {
  return await ShadertoySqlite.getShaders();
}

3.3 删除Shadertoy着色器数据

import 'package:shadertoy_sqlite/shadertoy_sqlite.dart';

Future<void> deleteShader(String shaderId) async {
  await ShadertoySqlite.deleteShader(shaderId);
}

4. 在UI中使用

你可以在Flutter的UI中使用这些方法来显示、添加或删除Shadertoy着色器数据。

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

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

class _ShaderListScreenState extends State<ShaderListScreen> {
  List<ShaderData> shaders = [];

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

  Future<void> loadShaders() async {
    List<ShaderData> loadedShaders = await ShadertoySqlite.getShaders();
    setState(() {
      shaders = loadedShaders;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Shadertoy Shaders'),
      ),
      body: ListView.builder(
        itemCount: shaders.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(shaders[index].name),
            subtitle: Text(shaders[index].description),
            onTap: () {
              // 处理点击事件
            },
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          // 添加新的着色器
          ShaderData newShader = ShaderData(
            id: 'unique_id',
            name: 'New Shader',
            description: 'A new shader description',
            code: 'void main() { ... }',
          );
          await ShadertoySqlite.insertShader(newShader);
          loadShaders();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

5. 处理错误

在实际应用中,你可能会遇到各种错误,比如数据库操作失败。你可以使用try-catch来捕获并处理这些错误。

try {
  await ShadertoySqlite.insertShader(shader);
} catch (e) {
  print('Failed to insert shader: $e');
}

6. 关闭数据库

在应用退出时,你可能需要关闭数据库连接。

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