diff --git a/packages/core/lib/src/core_html_widget.dart b/packages/core/lib/src/core_html_widget.dart index 20b3df554..fbf3e8aa1 100644 --- a/packages/core/lib/src/core_html_widget.dart +++ b/packages/core/lib/src/core_html_widget.dart @@ -141,10 +141,6 @@ class _HtmlWidgetState extends State { _wf = widget.factoryBuilder?.call() ?? WidgetFactory(); _wf.onRoot(_rootTsb); - - if (buildAsync) { - _future = _buildAsync(); - } } @override @@ -177,17 +173,25 @@ class _HtmlWidgetState extends State { if (needsRebuild) { _cache = null; - _future = buildAsync ? _buildAsync() : null; + _future = null; } } @override Widget build(BuildContext context) { - if (_future != null) { - return FutureBuilder( - builder: widget.buildAsyncBuilder ?? _buildAsyncBuilder, - future: _future!.then(_tshWidget), - ); + if (buildAsync) { + final buildAsyncBuilder = widget.buildAsyncBuilder ?? _buildAsyncBuilder; + final future = _future; + + if (future == null) { + WidgetsBinding.instance?.scheduleFrameCallback(_buildAsync); + return _tshWidget(buildAsyncBuilder(context, AsyncSnapshot.waiting())); + } else { + return FutureBuilder( + builder: buildAsyncBuilder, + future: future.then(_tshWidget), + ); + } } if (!enableCaching || _cache == null) _cache = _buildSync(); @@ -195,14 +199,21 @@ class _HtmlWidgetState extends State { return _tshWidget(_cache!); } - Future _buildAsync() async { + void _buildAsync(Duration _) async { + if (_future != null) return; + + final completer = Completer(); + setState(() { + _future = completer.future; + }); + final domNodes = await compute(_parseHtml, widget.html); Timeline.startSync('Build $widget (async)'); final built = _buildBody(this, domNodes); Timeline.finishSync(); - return built; + completer.complete(built); } Widget _buildSync() { @@ -250,9 +261,11 @@ Widget _buildAsyncBuilder( Center( child: Padding( padding: EdgeInsets.all(8), - child: Theme.of(context).platform == TargetPlatform.iOS - ? CupertinoActivityIndicator() - : CircularProgressIndicator(), + child: kIsWeb + ? Text('Loading...', style: Theme.of(context).textTheme.caption) + : Theme.of(context).platform == TargetPlatform.iOS + ? CupertinoActivityIndicator() + : CircularProgressIndicator(), ), );