Я использовал iframeElement в HtmlElementView, и в iframeElement есть ошибка, из-за которой кнопка флаттера не может вызвать событие в виджете Stack, поэтому я обертываю его в элемент div.
class _BroadcastViewState extends State<BroadcastView> {
@override
void didChangeDependencies() {
final IFrameElement iframeElement = IFrameElement();
iframeElement.height = MediaQuery.of(context).size.height.toString();
iframeElement.width = MediaQuery.of(context).size.width.toString();
iframeElement.src =
'/assets/index.html';
iframeElement.style.border = 'none';
iframeElement.id = 'iframe';
final wrapper = DivElement()
..style.width = '100%'
..style.height = '100%';
wrapper.append(iframeElement);
// ignore:undefined_prefixed_name
ui.platformViewRegistry.registerViewFactory(
BroadcastView.createViewId,
(int viewId) => wrapper,
);
}
@override
Widget build(BuildContext context) {
return HtmlElementView(
viewType: BroadcastView.createViewId,
);
}
}
И я использовал виджет Stack для добавления кнопки и запуска метода iframe
import 'dart:html';
import 'dart:js';
class BroadcastScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
BroadcastView(),
Positioned.fill(
child: Align(
alignment: Alignment.bottomRight,
child: RawMaterialButton(
onPressed: () {
IFrameElement frame = querySelector('#iframe');
var jsFrame = new JsObject.fromBrowserObject(frame);
JsObject jsDocument = jsFrame['contentDocument'];
jsDocument.callMethod('join');
},
child: new Icon(
Icons.live_tv,
color: Colors.white,
size: 25.0,
),
shape: new CircleBorder(),
elevation: 2.0,
fillColor: Theme.of(context).primaryColor,
padding: const EdgeInsets.all(15.0),
),
),
)
],
),
);
}
}
Однако querySelector ('# iframe') всегда возвращает ноль, даже я пытался запрос на консоли Chrome все еще возвращает ноль. Как получить доступ к элементу и функции iframe из HtmlElementView флаттера?