首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebView CustomScrollView +浮动AppBar

WebView CustomScrollView +浮动AppBar
EN

Stack Overflow用户
提问于 2019-01-16 15:08:42
回答 3查看 6.7K关注 0票数 13

我正在尝试创建一个屏幕,它有一个WebView (来自颤振:^0.3.5+3)和一个AppBar,我想在用户滚动的屏幕外滚动。

我偶然发现了这个指南,并尝试实现类似的东西,但没有骰子。

是否有一种在带有WebViewCustomScrollView中使用Slivers的方法,还是还不支持这种方法?

如果我在SliverChildListDelegate中创建常规小部件(我尝试了RowTextContainer等),我就可以让滚动应用程序条正常工作,但是没有一个WebView

代码语言:javascript
复制
@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,
                ),
              )
            ]
            ),
          )
        ],
      )
  );
}

任何指针/建议/RTFMs欢迎。

编辑赏金

乔丹-戴维斯提供的解决方案是可行的,但非常不稳定。每当SliverAppBar被滚动时,WebView尝试调整自身大小以填充剩余的视图。这导致了一种非常不稳定/缓慢的体验。

代码语言:javascript
复制
@override
Widget build(BuildContext context) {
  return CustomScrollView(
    slivers: <Widget>[
      SliverAppBar(
        title: const Text("Heading"),
        floating: true,
      ),
      SliverFillRemaining(
        child: WebView(initialUrl: "http://stackoverflow.com"),
      )
    ],
  );
}

有更好的办法吗?

EN

回答 3

Stack Overflow用户

发布于 2019-04-18 03:12:35

我其实想说点什么,但太长了,不适合

我可以给出我的观点,为什么在当前的插件状态下不可能这样做,默认情况下,Webview只在没有其他视图声明该手势时才响应拖动手势。另一方面,像SliverList这样的滚动条(这是使SliverAppBar向上滚动所必需的)默认情况下会消耗所有拖动滚动手势( -although )--您可以通过提供noScrollPhysics来禁用它--但是一旦WebView覆盖了所有屏幕,实际上就没有办法向条子报告,再次开始滚动。

因此,解决方案是修改WebView plugin本身,为拖动手势提供回调,希望颤振团队能够很快实现这一特性。

票数 1
EN

Stack Overflow用户

发布于 2019-01-16 15:43:07

我认为您应该看看如何使用SliverFillRemainingSliverFillViewport而不是SliverList。下面是一个使用SliverFillRemaining的示例

https://docs.flutter.io/flutter/widgets/SliverFillRemaining-class.html

代码语言:javascript
复制
@override
  Widget build(BuildContext context) {
    return CustomScrollView(
      slivers: <Widget>[
        SliverAppBar(
          title: const Text("Heading"),
          floating: true,
        ),
        SliverFillRemaining(
          child: WebView(initialUrl: "http://stackoverflow.com"),
        )
      ],
    );
  }
票数 0
EN

Stack Overflow用户

发布于 2022-09-06 14:56:58

经过多次尝试和错误之后,我找到了一种通过使用gestureRecognizers来解决类似问题的方法,如下所示:

代码语言:javascript
复制
  @override
  Widget build(BuildContext context) {
    return SliverFillRemaining(
      child: WebView(
        initialUrl: url,
        javascriptMode: JavascriptMode.unrestricted,
        gestureRecognizers: {
          Factory<VerticalDragGestureRecognizer>(
            () => VerticalDragGestureRecognizer(),
          ),
        },
      ),
    );
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54219987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档