Flutter服务器端驱动UI插件server_driven_ui的使用

Flutter服务器端驱动UI插件server_driven_ui的使用


Flutter服务器端驱动UI #

🚀 用于Flutter的服务器端驱动UI包。通过后端更改,可以同时在所有平台上部署新功能,而无需发布原生应用的新版本。

🚀 快速开始 #

下载该插件:

flutter pub add server_driven_ui

获取JSON并将其解析为小部件:

void main() {
  String json = """
  {
    "widgetName": "Scaffold"
  }
  """;

  runApp(MyApp(json: json));
}

class MyApp extends StatelessWidget {
  late String json;

  MyApp({required this.json});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: RouteWidget(
        provider: StaticContentProvider(content: json),
      ),
    );
  }
}

也可以创建并使用自定义小部件:

class CustomWidget extends BaseWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text("Hello, World!");
  }
}

void main() {
  // 参数 = 小部件名称, 小部件工厂
  WidgetRegistry.register('CustomWidget', () => CustomWidget()); // 将自定义小部件注册到服务器驱动UI小部件工厂存储。

  String json = """
  {
    "widgetName": "Scaffold",
    "child": {
      "widgetName": "CustomWidget"
    }
  }
  """;

  runApp(MyApp(json: json));
}

🖼️ 架构(核心逻辑) #

📄 文档 #

前往flutter-server-driven-ui GitHub Wiki

📄 许可证 #

flutter-server-driven-ui 使用的是BSD-3-Clause许可。


示例代码

example/main.dart

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

class ScaffoldWidget extends BaseWidget {
  late BaseWidget title;
  
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        body: getChildWidget(context),
        appBar: AppBar(title: title.build(context)));
  }

  [@override](/user/override)
  void setProperties(JSON json) {
    title = JSONParser.toWidget(json["title"]);
  }
}

class ColumnWidget extends BaseWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(children: getChildrenWidget(context));
  }
}

class TextWidget extends BaseWidget {
  late String message;
  late WidgetAction onClick;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GestureDetector(
      child: Text(message),
      onTap: () => onClick.execute(context),
    );
  }

  [@override](/user/override)
  void setProperties(JSON json) {
    message = json["message"] ?? "";
    onClick = JSONParser.toAction(json["onClick"]);
  }
}

AnimatedWidget verticalTransition(
    BuildContext context,
    Animation<double> animation,
    Animation<double> secondaryAnimation,
    Widget child) {
  var begin = Offset(0.0, 1.0);
  var end = Offset.zero;
  var curve = Curves.ease;
  var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
  return SlideTransition(
    position: animation.drive(tween),
    child: child,
  );
}

void main() {
  WidgetRegistry.register('Scaffold', () => ScaffoldWidget());
  WidgetRegistry.register('Column', () => ColumnWidget());
  WidgetRegistry.register('Text', () => TextWidget());
  PageTransitionRegistry.register('vertical', verticalTransition);
  runApp(const MyApp());
}

String json = """
{
  "widgetName": "Scaffold",
  "properties": {
    "title": {
      "widgetName": "Text",
      "properties": {
        "message": "Title"
      }
    }
  },
  "child": {
    "widgetName": "Text",
    "properties": {
      "message": "Click me",
      "onClick": {
        "actionType": "Route",
        "url": "http://localhost:4001/sub_page",
        "animationType": "vertical",
        "animationTime": 1000
      }
    }
  }
}
""";

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: RouteWidget(provider: StaticContentProvider(content: json)));
  }
}

更多关于Flutter服务器端驱动UI插件server_driven_ui的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter服务器端驱动UI插件server_driven_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用server_driven_ui插件的示例代码案例。请注意,server_driven_ui并不是Flutter官方或广泛认知的插件,因此这个示例将基于假设的功能和结构。在实际项目中,你可能会遇到不同的API和实现方式,具体细节需要参考该插件的官方文档。

假设server_driven_ui插件允许你从服务器动态加载UI组件,以下是一个简化的示例代码,展示如何使用该插件从服务器获取UI配置并动态渲染UI。

首先,确保你已经在pubspec.yaml文件中添加了server_driven_ui依赖(请注意,这里的依赖名是假设的,实际使用时请替换为真实插件名):

dependencies:
  flutter:
    sdk: flutter
  server_driven_ui: ^x.y.z  # 替换为实际版本号

然后,在你的Flutter项目中,你可以这样使用:

import 'package:flutter/material.dart';
import 'package:server_driven_ui/server_driven_ui.dart';  // 假设的导入路径

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  ServerDrivenUIController? _controller;

  @override
  void initState() {
    super.initState();
    // 初始化ServerDrivenUIController
    _controller = ServerDrivenUIController(
      endpoint: 'https://your-server.com/api/get-ui-config',  // 服务器API端点
      onUIReceived: (uiConfig) {
        // 当从服务器接收到UI配置时调用此方法
        setState(() {
          // 根据uiConfig动态构建UI
          // 这里假设uiConfig是一个包含Widget信息的JSON对象
          // 实际使用时,你需要根据插件的API解析并构建Widget
        });
      },
      onError: (error) {
        // 处理错误
        print('Error fetching UI config: $error');
      },
    );

    // 加载UI配置
    _controller!.fetchUIConfig();
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 在这里,我们假设还没有从服务器接收到UI配置,所以显示一个加载指示器
    // 一旦接收到配置,你应该使用uiConfig来构建实际的Widget树
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Server Driven UI Example'),
        ),
        body: Center(
          child: CircularProgressIndicator(),  // 加载指示器
        ),
      ),
    );
  }
}

// 假设的ServerDrivenUIController类(实际使用时请参考插件文档)
class ServerDrivenUIController {
  final String endpoint;
  final Function(dynamic uiConfig) onUIReceived;
  final Function(Object error) onError;

  void fetchUIConfig() async {
    try {
      final response = await http.get(Uri.parse(endpoint));
      if (response.statusCode == 200) {
        final uiConfig = jsonDecode(response.body);
        onUIReceived(uiConfig);
      } else {
        throw Exception('Failed to fetch UI config');
      }
    } catch (error) {
      onError(error);
    }
  }

  void dispose() {
    // 清理资源(如果有的话)
  }
}

注意

  1. 上面的代码是一个简化的示例,用于说明如何使用假设的server_driven_ui插件。
  2. 在实际项目中,你需要根据插件的API文档来调整代码。
  3. ServerDrivenUIController类是一个假设的实现,用于说明如何从服务器获取UI配置。实际使用时,请参考插件提供的控制器或客户端类。
  4. 解析和构建UI配置时,你可能需要使用Flutter的json_serializable包或其他JSON解析库来解析从服务器获取的JSON数据,并将其转换为Flutter的Widget树。

希望这个示例能帮助你理解如何在Flutter中使用server_driven_ui插件。如果有任何疑问或需要进一步的帮助,请查阅该插件的官方文档或联系插件的维护者。

回到顶部