WebView( webview_flutter:^ 0.3.5 + から)とAppBar
があり、ユーザーがスクロールすると画面外にスクロールする画面を作成しようとしています。
私はこれに遭遇しました guide と似たようなものを実装しようとしましたが、サイコロはありませんでした。WebView
でCustomScrollView
をSlivers
とともに使用する方法はありますか、それともまだサポートされていませんか?
SliverChildListDelegate
に通常のウィジェットを作成すると、スクロールアプリバーを機能させることができます(Row
、Text
、Container
などを試しました)。 WebView
で運がありませんでした。
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: const Text("Heading"),
floating: true,
),
SliverList(
delegate: SliverChildListDelegate([
Container(
child: WebView(
initialUrl: url,
javascriptMode: JavascriptMode.unrestricted,
),
)
]
),
)
],
)
);
}
どんなポインタ/提案/ RTFMも歓迎します。
バウンティの編集
Jordan-daviesが提供するソリューションは機能しますが、非常に不安定です。 SliverAppBar
がスクロールされるたびに、WebView
は残りのビューポートを埋めるためにサイズ変更を試みます。これは非常に途切れ途切れ/遅い体験になります。
@override
Widget build(BuildContext context) {
return CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: const Text("Heading"),
floating: true,
),
SliverFillRemaining(
child: WebView(initialUrl: "http://stackoverflow.com"),
)
],
);
}
SliverFillRemaining
の代わりにSliverFillViewport
またはSliverList
の使用を検討する必要があると思います。 SliverFillRemaining
を使用した例
https://docs.flutter.io/flutter/widgets/SliverFillRemaining-class.html
@override
Widget build(BuildContext context) {
return CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: const Text("Heading"),
floating: true,
),
SliverFillRemaining(
child: WebView(initialUrl: "http://stackoverflow.com"),
)
],
);
}
実際にコメントしたかったのですが長すぎて
プラグインの現在の状態ではそれができない理由について、私のビューを示します。デフォルトでは、Webview
は、他のビューがそのジェスチャーを要求していない場合にのみドラッグジェスチャーに応答します。一方、SliverList
をスクロールアップするために必要なSliverAppBar
のようなスクロールスライバーは、デフォルトですべてのドラッグスクロールジェスチャーを消費します-提供することで無効にできますが、 noScrollPhysics-ただし、WebView
がすべての画面をカバーすると、実際にスライバーにレポートして消費スクロールを再開する方法がなくなります。
したがって、解決策はWebView plugin
自体がドラッグジェスチャーのコールバックを提供します。フラッターチームがこの機能をすぐに実装することを願っています。