无法单独构建 Flutter Web 和 Flutter Mobile 应用

2024-02-18

我正在构建一个 flutter 项目,并且在将 Web 和移动代码集成到单个项目中时遇到问题。我想在我的移动代码中使用 Moor 和 Moor_FFI,但即使我的 web (main.dart) 和移动代码 (main.dev.dart) 的入口点配置为不同的调试,它仍然尝试编译网络移动代码。这会导致一个问题,因为 Flutter Web 目前不支持 FFI 和其他 Dart 插件,从而导致大量错误消息。

Error compiling dartdevc module:ffi|lib/ffi.ddc.js

packages/ffi/src/utf8.dart:6:8: Error: Not found: 'dart:ffi'
import 'dart:ffi';
       ^
packages/ffi/src/utf16.dart:6:8: Error: Not found: 'dart:ffi'
import 'dart:ffi';
       ^
packages/ffi/src/allocation.dart:5:8: Error: Not found: 'dart:ffi'
import 'dart:ffi';
       ^
packages/ffi/src/utf8.dart:23:20: Error: Type 'Struct' not found.
class Utf8 extends Struct {
                   ^^^^^^
packages/ffi/src/utf8.dart:26:21: Error: Type 'Pointer' not found.
  static int strlen(Pointer<Utf8> string) {
                    ^^^^^^^
packages/ffi/src/utf8.dart:26:21: Error: Expected 0 type arguments.
  static int strlen(Pointer<Utf8> string) {
                    ^
packages/ffi/src/utf8.dart:41:26: Error: Type 'Pointer' not found.
  static String fromUtf8(Pointer<Utf8> string) {
                         ^^^^^^^
packages/ffi/src/utf8.dart:41:26: Error: Expected 0 type arguments.
  static String fromUtf8(Pointer<Utf8> string) {
                         ^
packages/ffi/src/utf8.dart:54:10: Error: Type 'Pointer' not found.
  static Pointer<Utf8> toUtf8(String string) {
         ^^^^^^^
packages/ffi/src/utf8.dart:54:10: Error: Expected 0 type arguments.
  static Pointer<Utf8> toUtf8(String string) {
         ^
packages/ffi/src/utf16.dart:16:21: Error: Type 'Struct' not found.
class Utf16 extends Struct {
                    ^^^^^^
packages/ffi/src/utf16.dart:24:10: Error: Type 'Pointer' not found.
  static Pointer<Utf16> toUtf16(String s) {
         ^^^^^^^
packages/ffi/src/utf16.dart:24:10: Error: Expected 0 type arguments.
  static Pointer<Utf16> toUtf16(String s) {
         ^
packages/ffi/src/allocation.dart:9:7: Error: Type 'DynamicLibrary' not found.
final DynamicLibrary stdlib = Platform.isWindows
      ^^^^^^^^^^^^^^
packages/ffi/src/allocation.dart:13:29: Error: Type 'Pointer' not found.
typedef PosixMallocNative = Pointer Function(IntPtr);
                            ^^^^^^^
packages/ffi/src/allocation.dart:13:46: Error: Type 'IntPtr' not found.
typedef PosixMallocNative = Pointer Function(IntPtr);
                                             ^^^^^^
packages/ffi/src/allocation.dart:14:23: Error: Type 'Pointer' not found.
typedef PosixMalloc = Pointer Function(int);
                      ^^^^^^^
packages/ffi/src/allocation.dart:18:27: Error: Type 'Void' not found.
typedef PosixFreeNative = Void Function(Pointer);
                          ^^^^
packages/ffi/src/allocation.dart:18:41: Error: Type 'Pointer' not found.
typedef PosixFreeNative = Void Function(Pointer);
                                        ^^^^^^^
packages/ffi/src/allocation.dart:19:35: Error: Type 'Pointer' not found.
typedef PosixFree = void Function(Pointer);
                                  ^^^^^^^
packages/ffi/src/allocation.dart:23:31: Error: Type 'Pointer' not found.
typedef WinGetProcessHeapFn = Pointer Function();
                              ^^^^^^^
packages/ffi/src/allocation.dart:26:7: Error: Type 'Pointer' not found.
final Pointer processHeap = winGetProcessHeap();
      ^^^^^^^

And so on.....

有没有办法将编译器配置为仅针对各自的运行构建与 Web 或 Mobile 相关的文件?

供参考:Github 存储库,重新创建了错误:https://github.com/JoshMarkF/MoorFFIIntegrationDemo https://github.com/JoshMarkF/MoorFFIIntegrationDemo


Edit
flutter build web and flutter run -d chrome一切正常。
因为网络用户界面代码(webui.dart)和移动用户界面代码(mobileui.dart)位于不同的 dart 文件中,
所以这两个文件可以有不同的import

您可以复制粘贴运行3下面的三个文件,main.dart, webui.dart and mobileui.dart
您可以使用conditional import分离网络和移动设备的不同实现
所以网络和移动可以有完全不同的逻辑

带前缀的代码片段调用multiPlatform

import 'mobileui.dart' if (dart.library.html) 'webui.dart' as multiPlatform;
...
home:  multiPlatform.TestPlugin(),

使用时的工作演示Android Studio运行与Android Emulator and Chrome

主程序.dart

import 'package:flutter/material.dart';
import 'mobileui.dart' if (dart.library.html) 'webui.dart' as multiPlatform;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget { 
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(        
        primarySwatch: Colors.blue,
      ),
      home:  multiPlatform.TestPlugin(),
    );
  }
}

mobileui.dart

import 'package:flutter/material.dart';

class TestPlugin extends StatefulWidget {
  @override
  _TestPluginState createState() => _TestPluginState();
}

class _TestPluginState extends State<TestPlugin> {
  @override
  Widget build(BuildContext context) {
    return Text("Mobile");
  }
}

webui.dart

import 'package:flutter/material.dart';
import 'dart:html' as html;
import 'dart:js' as js;
import 'dart:ui' as ui;


class TestPlugin extends StatefulWidget {
  TestPlugin();

  _TestPluginState createState() => _TestPluginState();
}

class _TestPluginState extends State<TestPlugin> {
  String createdViewId = 'map_element';

  @override
  void initState() {
    // ignore: undefined_prefixed_name
    ui.platformViewRegistry.registerViewFactory(
        createdViewId,
            (int viewId) => html.IFrameElement()
          ..width = MediaQuery.of(context).size.width.toString() //'800'
          ..height = MediaQuery.of(context).size.height.toString() //'400'
          ..srcdoc = """<!DOCTYPE html><html>
          <head><title>Page Title</title></head><body><h1>This is a Heading</h1><p>This is a paragraph.</p></body></html>"""
        /*..src = "http://f12apidev32.umc.com/Tableau/jsapi_practice.aspx"*/
          ..style.border = 'none');

    super.initState();
  }

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

  @override
  Widget build(BuildContext context) {
    return Container(
        padding: EdgeInsets.symmetric(horizontal: 10),
        decoration: BoxDecoration(
            color: Colors.white,
            border: Border.all(color: Colors.grey[300], width: 1),
            borderRadius: BorderRadius.all(Radius.circular(5))),
        width: 200,
        height: 200,
        child: Directionality(
            textDirection: TextDirection.ltr,
            child: HtmlElementView(
              viewType: createdViewId,
            )));
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法单独构建 Flutter Web 和 Flutter Mobile 应用 的相关文章

随机推荐

  • 在Configure()之后启动IHostedService

    我有一个 NET Core 3 1 应用程序 它提供一个描述应用程序运行状况的端点 以及一个处理数据库中数据的 IHostedService 但有一个问题 HostedService 的工作函数开始处理很长时间 结果Configure 未调
  • WPF ListView 绑定到列标题

    我正在尝试创建一个动态绑定到一组日期的列表视图 因此 用户将能够选择一个日期范围 所选日期的结果将与列标题中的日期一起显示 我已经解决了所有问题 只有一个问题 日期没有显示在标题中 我有以下内容 我看不出它不起作用的任何原因 public
  • 如何在yii2中过滤日期字段

    我想过滤日期列 例如 3 个月前 6 个月前 1 年前 我在 gridview 的搜索字段中创建了一个下拉菜单 如下所示 attribute gt modified value gt name filter gt array ID1 gt
  • 通过 pip 安装 mysqlclient 时遇到问题

    我正在开发一个 Django 1 9 2 项目 需要连接到 MySQl 数据库 并且我正在尝试使用推荐的 mysqlclient 库 但是 当我尝试通过安装pip install mysqlclient我收到以下错误 Complete ou
  • 最佳圆拟合算法

    I need a very precise algorithm for fitting a circle to the set of data points actually I need to determine the center T
  • 使用 XML 代替 HTML 创建网页有哪些优点?

    有时 我会看到内容仅用 XML 而不是 HTML 或 XHTML 编写的网页 这些页面通常附加一些样式表 XSLT 或 CSS 这使得它们看起来像任何其他普通网页 我的问题是 这种方法有什么优点 如果有的话 为什么有人会选择这种方式 EDI
  • 如何使用 mysqldump 保存 UTF8mb4 数据?

    我正在使用 mysqldump 转储包含带有 UTF8MB4 数据的 UTF8MB4 列的数据库 当我导入这个 sql文件导入到支持 UTF8MB4 的新数据库中 所有 UTF8MB4 字符都会转换为 有人知道如何使 MySQL 和导入与
  • 如何使用 ffmpeg 从 YUV 视频中提取帧(或特定帧)

    这是从a中提取帧的代码MP4视频 ffmpeg i above marathon 250 mp4 images 03d bmp但相同的代码不适用于YUV格式化视频 有谁知道如何从中提取帧YUV格式化视频 它不起作用 因为 yuv 文件没有标
  • SVG矢量图形可以转换为PNG文件格式以便在Fireworks中使用吗?

    众所周知 有很多网站出售免版税图形 有些网站出售矢量图形 svg 或为您提供下载矢量图形的选项 我没有支持 SVG 的图形编辑器 目前 我正在使用旧版本的 Fireworks 我无法打开 SVG 文件类型 我也买不起 PhotoShop 或
  • 使用 WebClient 和 WebRequest 之间的编码差异?

    在获取一些随机的西班牙报纸索引时 我没有使用 WebRequest 正确获取变音符号 它们产生了这个奇怪的字符 同时使用 a 从同一个 uri 下载响应WebClient我得到了适当的回应 为什么会出现这种差异化呢 var client n
  • 通过调整浏览器大小来缩放 KineticJS Stage?

    最近发现了 KineticJS 因为我一直在尝试将我的 Flash 技能转换为 HTML Canvas 这是一个非常令人印象深刻的工具 问题 如果我使用像 Bootstrap 这样的前端 并且我有一个页面 其中包含几个包含 KineticJ
  • 在排序函数中处理 nils

    我不知道如何处理nils我的排序函数得到了 当我检查这个时 table sort一些电话后崩溃 if a nil then return false elseif b nil then return true end 出现此错误 用于排序的
  • SailsJS 中的 API 版本控制

    基于这个问题 我已经禁用了嵌套控制器和蓝图 我的问题是这样的 API 控制器 v1 UserController js 路线 js POST v1 user register v1 UserController createUser 策略
  • 在 Javascript for 循环声明中声明 var

    我确定我已经阅读过有关此问题的讨论 但找不到 简而言之 在循环声明内声明 for 循环的增量是否有缺点 这有什么区别 function foo for var i 0 i lt 7 i code 和这个 function foo var i
  • 如何模拟图像上传到Google App Engine Blobstore

    我正在使用 create upload url 将图像上传到 GAE blobstore uploadURL blobstore create upload url upload 为了对gae代码进行单元测试 您可以模拟图像上传吗 或者我应
  • Ehcache 与静态地图缓存实现

    我有几个表 其中的条目很少 并且它们永远不会动态更改 所以我想将整个表缓存在内存中以减少数据库的负载 我可以通过静态地图并将地图填充到静态块中轻松实现这一点 我想知道 Ehcache hibernate 是否可以以更有效的方式实现同 样的功
  • 在 data.table 中多次使用 :=

    我经常发现自己使用以下方法进行一长串链式计算 在同一个数据表上 例如 像这样的东西 test data table 1 10 1 10 1 10 1 10 test V1 V1 2 test V2 V1 V2 test V3 V2 V3 t
  • 使用 jQuery / AJAX 解码 JSON

    我正在尝试使用 jQuery 解码 JSON 这是我得到的结果 例如一个班级 这里有一个学生 Students Name John Grade 17 TotalClass 17 TotalCount 1 这就是我所做的 j ajax typ
  • 哪些 Web 框架和语言的开发时间最短?

    我正在尝试将一些网络开发想法付诸实践 不幸的是 我将是唯一的开发人员 因此我专注于获得一个良好的可调试 可测试的设置 以便我可以快速开发应用程序 您会推荐哪些语言 开发风格和框架来实现快速开发 上次我检查 RoR 是下一件大事 但那是很久以
  • 无法单独构建 Flutter Web 和 Flutter Mobile 应用

    我正在构建一个 flutter 项目 并且在将 Web 和移动代码集成到单个项目中时遇到问题 我想在我的移动代码中使用 Moor 和 Moor FFI 但即使我的 web main dart 和移动代码 main dev dart 的入口点