Flutter自定义组件开发插件DivKit的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter自定义组件开发插件DivKit的使用

DivKit Playground app

Pub GitHub Stars

DivKit 🐋 是一个开源的服务器驱动UI(SDUI)框架。它允许你对不同版本的应用程序进行服务器端更新。此外,它还可以用于快速UI原型设计,让你可以一次编写布局,然后在任何地方使用Flutter进行部署。DivKit是开始在项目中使用服务器驱动UI的绝佳选择,因为它可以轻松地集成到应用的任何部分作为一个简单的视图。在开始时,你不需要服务器集成。你可以在客户端包含所有JSON来尝试在实际应用中使用它。

我们还为你提供了一个 沙箱,你可以在这里尝试不同的示例,并查看结果。你可以使用 DivKit网站 查找大量实用的示例和文档,但如果你有任何问题,随时在Telegram社区聊天中询问我们。

文档Medium教程Хабр上的概述

Telegram: 新闻 | 英文聊天 | 俄文聊天

如何工作

DivKit从JSON数据构建原生视图。

JSON → DivData → DivKitView

  • JSON – 原始数据,包含DivKit格式的模板(参见 DivKit schema)。
  • DivData – 从JSON解析的数据对象(参见 生成的DTO)。
  • DivKitView – 纯粹的Flutter小部件(你可以直接使用它)。

沙箱应用

由于Flutter客户端不支持在Web上完全启动,因此,为了测试功能,你需要运行当前库的示例。使用 DivKit沙箱应用 浏览布局示例和支持的功能。

主要的示例存储在monorepo中… 在开始之前,从 client/flutter/divkit 调用以下命令以创建软链接:

./tool/get_test_data.sh

支持的功能

Flutter客户端正在开发中,欢迎贡献并帮助社区在该平台上使用DivKit。

支持的组件(可能包含不可用的功能,详情请参阅文档):

  • text
  • image
  • container
  • state
  • input
  • gallery
  • pager
  • custom

DivKit Flutter. 快速入门

构建应用并绘制你的第一个DivKitView

  1. 添加依赖项到 pubspec.yaml

    dependencies:
        divkit: any
    
  2. 导入库

    import 'package:divkit/divkit.dart';
    
  3. 使用DivKitData解析布局:

    从JSON:

    final data = DefaultDivKitData.fromJson(json); // json is Map<String, dynamic>
    

    或者从卡片和模板:

    final data = DefaultDivKitData.fromScheme(
        card: json['card'], // Map<String, dynamic>
        templates: json['templates'], // Map<String, dynamic>?
    );
    

    注意:构建DTO的过程相当昂贵,最好在小部件外部创建它,以避免帧丢失。

    构建并预加载数据以确保即时渲染:

    await data.build(); 
    // 或者对于小型布局使用同步变体
    // data.buildSync();
    await data.preload();  // 提供内置在DivKitView中的存储
    
  4. 在小部件树中使用DivKitView,通过参数 “data” 传递布局:

    DivKitView(
        data: data, // DivKitData
    )
    

    你可以选择传递自定义处理器、动作处理器和其他参数来配置DivKitView的行为:

    DivKitView(
      data: data,
      customHandler: MyCustomHandler(), // DivCustomHandler?
      actionHandler: MyCustomActionHandler(), // DivActionHandler?
      variableStorage: MyVariableStorage(), // DivVariableStorage?
    )
    

    注意:如果你希望使用默认的div动作并使用自己的actionHandler,请不要忘记继承 DefaultDivActionHandler

示例代码

以下是 example/lib/main.dart 的示例代码:

import 'package:divkit/divkit.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import 'src/app.dart';

void main() {
  // DivKit日志输出
  logger
    ..keepLog = kDebugMode
    ..onLog = print;

  debugPrintDivKitViewLifecycle = true;
  debugPrintDivExpressionResolve = true;
  debugPrintDivPerformLayout = false;

  runApp(const ProviderScope(child: PlaygroundApp()));
}

希望这些信息对你有所帮助!如果有任何问题或需要进一步的帮助,请随时联系我。


更多关于Flutter自定义组件开发插件DivKit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义组件开发插件DivKit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用自定义组件开发插件DivKit的示例代码。这个示例假定你已经安装了DivKit插件,并且已经在你的Flutter项目中进行了配置。

1. 添加DivKit依赖

首先,确保在你的pubspec.yaml文件中添加了DivKit的依赖:

dependencies:
  flutter:
    sdk: flutter
  div_kit: ^latest_version  # 替换为实际的最新版本号

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

2. 创建一个自定义组件

接下来,我们可以使用DivKit来创建一个自定义组件。假设我们要创建一个简单的按钮组件。

2.1 创建一个新的Dart文件,例如custom_button.dart

import 'package:flutter/material.dart';
import 'package:div_kit/div_kit.dart';  // 导入DivKit库

// 使用DivKit的[@DivComponent](/user/DivComponent)注解来定义一个自定义组件
[@DivComponent](/user/DivComponent)()
class CustomButton extends StatelessWidget {
  final String text;
  final VoidCallback onPressed;

  CustomButton({required this.text, required this.onPressed});

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: Text(text),
    );
  }
}

2.2 在你的Flutter应用中注册这个组件

main.dart或者一个合适的地方,确保你注册了自定义组件:

import 'package:flutter/material.dart';
import 'package:div_kit/div_kit.dart';
import 'custom_button.dart';  // 导入自定义组件

void main() {
  // 注册自定义组件
  DivKit.registerComponent(CustomButton.tag, (context, attrs) {
    String text = attrs['text'] ?? '';
    VoidCallback? onPressed = attrs['onPressed'] as VoidCallback?;
    return CustomButton(text: text, onPressed: onPressed);
  });

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('DivKit Custom Component Example'),
        ),
        body: Div(
          children: [
            DivElement(
              tag: CustomButton.tag,
              attributes: {
                'text': 'Click Me',
                'onPressed': () {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Button Clicked')));
                },
              },
            ),
          ],
        ),
      ),
    );
  }
}

3. 运行你的应用

现在,你可以运行你的Flutter应用,并应该看到一个自定义的按钮。点击按钮时,会显示一个SnackBar提示。

解释

  • @DivComponent():这个注解用于标记一个自定义组件。
  • DivKit.registerComponent:这个方法用于注册自定义组件,使其能够在DivKit中使用。
  • DivElement:这是DivKit中用于定义组件实例的类。你可以通过tag属性指定组件类型,并通过attributes属性传递参数。

这个示例展示了如何在Flutter中使用DivKit来创建和使用自定义组件。你可以根据需要扩展和修改这个示例来适应你的具体需求。

回到顶部