Flutter Error: Not found: ‘dart:html‘

场景:Flutter web合并Flutter App。
问题:Error: Not found: ‘dart:html’。
原因:Flutter web使用了dart:html包的类,而Flutter App没有dart:html相关类。
解决:程序启动时判断是Flutter web还是Flutter App,再根据启动的程序类型修改引入对象。

1.例如我这里有个一个EmbedBuilderWeb类,是Flutter web专门使用的类,这里引入了dart:html依赖包。

Widget defaultEmbedBuilderWeb(BuildContext context, Embed node, bool readOnly) {
  switch (node.value.type) {
    case 'image':
    case 'video':
      final String src = node.value.data;
UniversalUI().platformViewRegistry.registerViewFactory(
          src, (viewId) => html.IFrameElement()..src = src);
      return Column(children: [
        Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            mainAxisSize: MainAxisSize.min,
            children: [
              Container(
                constraints: BoxConstraints(
                    maxHeight: MediaQuery.of(context).size.height),
                child: HtmlElementView(
                  viewType: src,
                ),
              )
            ])
      ]);

    default:
      throw UnimplementedError(
        'Embeddable type "${node.value.type}" is not supported by default '
        'embed builder of QuillEditor. You must pass your own builder function '
        'to embedBuilder property of QuillEditor or QuillField widgets.',
      );
  }
}

2.创建三个类:
IFrame:用于中间承接转化工具。
IFrameHtml:如果是Flutter web就引入这个包 。
IFrameIo:如果是Flutter App就引入这个包 。

—注意点—
以上三个类必须有一个同名同参函数
例如:
IFrame有getName(),那么IFrameHtml,IFrameIo都必须有getName()函数,函数体和返回值可以不一样。

1)IFrameHtml(这个是Flutter web需要的工具类)

import 'package:自己包名路径/EmbedBuilderWeb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_quill/flutter_quill.dart';

Widget getDefaultEmbedBuilderWeb(
    BuildContext context, Embed node, bool readOnly) {
  return defaultEmbedBuilderWeb(context, node, readOnly);
}

2)IFrameIo(这个是Flutter App需要的工具类,App不需要用到这个类,所以我这里直接返回Container,这里没关系)

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

Widget getDefaultEmbedBuilderWeb(
    BuildContext context, Embed node, bool readOnly) {
  return Container();
}

3)IFrame(这个是承接转化前面两个类的中间类)

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

Widget getDefaultEmbedBuilderWeb(
    BuildContext context, Embed node, bool readOnly) {
  throw Error();
}

3.工具类引用

import 'IFrame.dart'
    if (dart.library.io) 'IFrameIo.dart'
    if (dart.library.html) 'IFrameHtml.dart' as frame;
 
 //函数调用   
frame.getDefaultEmbedBuilderWeb

if (dart.library.io):如果启动的是Flutter App
if (dart.library.html):如果启动的是Flutter web
as frame:as 设置别名,名称随意

举一反三,其他类似的异常也是可以按这样方式实现。

end----------------------------------------------------

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值