Flutter网页框架集成插件web_framework_flutter_api的使用

Flutter网页框架集成插件web_framework_flutter_api的使用

如果您希望在Android上运行示例,则需要物理设备或arm64-v8a模拟器。服务器需要几个文件才能运行:

  • assets/executors/web.json 包含路由信息
  • assets/executors/hello_executor.dll(Windows)或 assets/executors/libhello_executor.so(Android)
  • assets/configs/config.json 包含服务器设置

快速开始

main.dart

import 'dart:io';
import 'dart:async';

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

import 'package:web_framework_flutter_api/config.dart';
import 'package:web_framework_flutter_api/web_framework.dart';
import 'package:web_framework_flutter_api/web_framework_exception.dart';
import 'package:web_framework_flutter_api/web_framework_utilities.dart';

import 'package:url_launcher/url_launcher.dart';

Future<void> main() async {
  if (Platform.isAndroid) {
    await unpackAndroidAssets(); // 在Android设备上解压资产文件
  }

  runApp(const App());
}

class App extends StatefulWidget {
  const App({super.key});

  @override
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  String _message = "服务器未运行";
  String _address = "";
  WebFramework? _server;
  bool _isRunning = false;
  TapGestureRecognizer? _recognizer;

  void _initAddress(Config config) {
    String ip = config.getConfigurationString("ip"); // 从配置文件获取IP地址
    int port = config.getConfigurationInteger("port"); // 从配置文件获取端口号
    bool useHTTPS = config.getConfigurationBoolean("useHTTPS"); // 从配置文件获取HTTPS设置

    if (ip == "0.0.0.0") {
      ip = "127.0.0.1";
    }

    _address = "${useHTTPS ? "https" : "http"}://$ip:$port";
  }

  Future<void> start() async {
    Config? config;

    try {
      config = await Config.fromPath("configs/config.json"); // 创建配置对象

      config.overrideBasePath("${config.handler.assetsPath}/executors"); // 覆盖加载执行器的基础路径

      _server = await WebFramework.fromConfig(config); // 创建服务器

      await _server!.start(); // 在隔离中启动服务器

      setState(() {
        _isRunning = true;

        _initAddress(config!);

        config.dispose(); // 处置配置对象

        _message = "服务器正在运行于";
      });
    } on WebFrameworkException catch (e) {
      _message = e.toString();

      e.dispose();
      config?.dispose();
    } on Exception catch (e) {
      _message = e.toString();

      config?.dispose(); // 处置配置对象
    }

    // 如果小部件在异步平台消息飞行时被从树中移除,我们希望丢弃回复而不是调用
    // setState来更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {});
  }

  Future<void> stop() async {
    try {
      if (_server == null) {
        return;
      }

      await _server!.stop(wait: true);

      setState(() {
        _isRunning = false;

        _address = "";

        _message = "服务器未运行";
      });
    } on WebFrameworkException catch (e) {
      _message = e.toString();
    } on Exception catch (e) {
      _message = e.toString();
    }
  }

  @override
  Widget build(BuildContext context) {
    _recognizer?.dispose();

    if (_address.isNotEmpty) {
      _recognizer = TapGestureRecognizer()..onTap = () => launchUrl(Uri.parse(_address));
    } else {
      _recognizer = TapGestureRecognizer();
    }

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("插件示例应用"),
        ),
        body: Column(children: [
          Center(
            child: RichText(
                text: TextSpan(children: [
                  TextSpan(text: _message, style: const TextStyle(color: Colors.black)),
                  TextSpan(
                    text: _address,
                    style: const TextStyle(color: Colors.blue),
                    recognizer: _recognizer,
                  )
                ])),
          ),
          if (_isRunning)
            Center(
                child: TextButton(
                    onPressed: stop,
                    style: const ButtonStyle(backgroundColor: WidgetStatePropertyAll(Colors.blue), foregroundColor: WidgetStatePropertyAll(Colors.white)),
                    child: const Text("停止服务器")))
          else
            Center(
                child: TextButton(
                    onPressed: start,
                    style: const ButtonStyle(backgroundColor: WidgetStatePropertyAll(Colors.blue), foregroundColor: WidgetStatePropertyAll(Colors.white)),
                    child: const Text("启动服务器")))
        ]),
      ),
    );
  }

  @override
  void dispose() {
    super.dispose();

    _server?.dispose(); // 处置服务器
    _recognizer?.dispose();
  }
}

设置

assets/executors/web.json

{
  "HelloExecutor": {
    "route": "",
    "loadType": "initialization"
  }
}

配置

assets/configs/config.json

{
  "WebServer": {
    "ip": "0.0.0.0",
    "port": 8080,
    "timeout": 0
  },
  "WebFramework": {
    "settingsPaths": [
      "web.json"
    ],
    "loadSources": [
      "hello_executor"
    ],
    "assetsPath": "assets",
    "templatesPath": "templates",
    "cachingSize": 536870912,
    "webServerType": "multiThreaded",
    "HTTPS": {
      "useHTTPS": false,
      "pathToCertificate": "certificates/cert.pem",
      "pathToKey": "certificates/key.pem"
    },
    "defaultAssetsPath": "WebFrameworkAssets"
  },
  "Logging": {
    "usingLogging": false,
    "dateFormat": "DMY",
    "logFileSize": 134217728
  },
  "ThreadPoolServer": {
    "threadCount": 0
  }
}

运行示例

构建并运行示例在Android Studio中。

您将看到来自服务器的响应:

{
  "message": "Hello, World!"
}

执行器

执行器是负责为其路由(URL)提供响应的C++类。

HelloExecutor.h

#pragma once

#include "Executors/BaseStatelessExecutor.h"

namespace executors
{
	class HelloExecutor : public framework::BaseStatelessExecutor
	{
	public:
		HelloExecutor() = default;

		void doGet(framework::HTTPRequest& request, framework::HTTPResponse& response) override;

		~HelloExecutor() = default;
	};
}

HelloExecutor.cpp

#include "HelloExecutor.h"

#include "JSONBuilder.h"

namespace executors
{
	void HelloExecutor::doGet(framework::HTTPRequest& request, framework::HTTPResponse& response)
	{
		response.addBody(json::JSONBuilder(CP_UTF8).appendString("message", "Hello, World!"));
	}

	DECLARE_EXECUTOR(HelloExecutor);
}

更多关于Flutter网页框架集成插件web_framework_flutter_api的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网页框架集成插件web_framework_flutter_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中集成并使用web_framework_flutter_api插件的示例代码。请注意,这个示例假定web_framework_flutter_api是一个实际存在的插件,但由于这个插件名称可能是虚构的,我会给出一个类似的集成和调用第三方插件的通用模板。如果你使用的插件有特定的API和方法,请根据文档进行调整。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加该插件的依赖。假设插件名为web_framework_flutter_api

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

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

2. 导入插件

在你的Dart文件中导入该插件:

import 'package:web_framework_flutter_api/web_framework_flutter_api.dart';

3. 使用插件功能

假设web_framework_flutter_api提供了一个用于与Web框架交互的方法,比如loadWebPage,你可以这样使用它:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Web Framework Example'),
        ),
        body: Center(
          child: WebViewExample(),
        ),
      ),
    );
  }
}

class WebViewExample extends StatefulWidget {
  @override
  _WebViewExampleState createState() => _WebViewExampleState();
}

class _WebViewExampleState extends State<WebViewExample> {
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        // 假设loadWebPage是插件提供的方法,用于加载网页
        // 请根据实际插件的API文档替换为正确的方法调用和参数
        WebFramework().loadWebPage(url: 'https://www.example.com');
      },
      child: Text('Load Web Page'),
    );
  }
}

// 假设WebFramework是插件中提供的一个类
class WebFramework {
  // 这是一个假设的方法,实际使用时请根据插件文档替换
  Future<void> loadWebPage({required String url}) async {
    // 这里应该调用插件的实际API来加载网页
    // 例如:await plugin.loadUrl(url);
    // 由于我们不知道实际API,这里仅作为示例
    print('Loading web page: $url');
  }
}

注意:上面的WebFramework类和loadWebPage方法是假设的,实际使用时,你需要根据web_framework_flutter_api插件的文档来调用正确的方法和类。

4. 运行应用

确保你的开发环境已经设置好,然后运行flutter run来启动应用。如果你正确地集成了插件并调用了其API,你应该能够看到按钮,并且点击按钮时能够触发网页加载(或打印日志,取决于你的实现)。

结论

由于web_framework_flutter_api可能是一个虚构的插件名称,上面的代码提供了一个集成和使用第三方Flutter插件的通用模板。在实际项目中,你需要根据插件的官方文档来调整代码,特别是API的调用部分。

回到顶部