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----------------------------------------------------

你可能感兴趣的:(Flutter,flutter,html,flutter,web)