场景: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----------------------------------------------------