【问题标题】:Pass tap event to the child behind in Stack将点击事件传递给 Stack 后面的孩子
【发布时间】:2020-08-08 07:54:23
【问题描述】:

在观看了有关在 Flutter 中创建自定义 PageView 的教程视频后,我遇到了一个问题。 为了实现自定义 PageView 的页面位置,我使用了一组项目,这些项目根据放置在 Stack.fill() 中 Stack.fill() 中的每个其他元素上方的 PageView 向左/向右滑动。

代码示例如下:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Test')),
      body: Container(
        height: 200.0,
        child: Stack(
          children: <Widget>[
            Container(
              color: Colors.blueGrey,
              width: double.infinity,
              height: double.infinity,
              child: Material(
                type: MaterialType.transparency,
                child: InkWell(
                  onTap: () {
                    print('InkWell tapped');
                  },
                ),
              ),
            ),
            Positioned.fill(
              child: PageView.builder(
                itemBuilder: (context, index) {
                  return Container(
                    child: Center(
                      child: Text(
                        '$index',
                        style: TextStyle(
                          color: Colors.white,
                          fontSize: 25.0,
                        ),
                      ),
                    ),
                  );
                },
                itemCount: 4,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

问题是我想在 PageView 后面的 InkWell 上触发 Tap 事件,同时仍然能够滑动 PageView。

是否可以将点击事件传递给 PageView 后面的元素? 谢谢。


编辑:

由于您不应该在 Flutter 中扩展小部件,我刚刚制作了一个使用 HitTestBehavior.translucent 而不是 HitTestBehavior.opaque 的 Scrollable 类的副本。之后,您使用这个新的 Scrollable 创建一个 PageView 的副本。

通过这样的修改 - PageView 后面的孩子开始接收手势。

【问题讨论】:

标签: flutter


【解决方案1】:

解决方案

由于您不应该在 Flutter 中扩展小部件,我刚刚制作了一个使用 HitTestBehavior.translucent 而不是 HitTestBehavior.opaque 的 Scrollable 类的副本。之后,您使用这个新的 Scrollable 创建一个 PageView 的副本。

通过这样的修改 - PageView 后面的孩子开始接收手势。

【讨论】:

    【解决方案2】:

    这个是不用栈的,

       Scaffold(
                appBar: AppBar(title: Text('Test')),
                body: Container(
                  color: Colors.red,
                  height: 200.0,
                  child: InkWell(
                    onTap: () {
                      print('InkWell tapped');
                    },
                    child: PageView.builder(
                      itemCount: 4,
                      itemBuilder: (context, index) {
                        return Container(
                          child: Center(
                            child: Text(
                              '$index',
                              style: TextStyle(
                                color: Colors.white,
                                fontSize: 25.0,
                              ),
                            ),
                          ),
                        );
                      },
                    ),
                  ),
                ),
              ),
    

    【讨论】:

    • 不是一个选项。堆栈中有 10 个 InkWell 的图像。
    • @Thepeanut 好吧,到目前为止,您的问题似乎无法以您想要的方式解决,请查看以下两个链接:stackoverflow.com/questions/49510694/…,以及此github.com/flutter/flutter/issues/47119
    • 感谢 Github 问题,它已经解决了问题 :) 更改 ScrollableState 以使用半透明的 HitTestBehavior 触发事件。现在我只需要创建一个自定义 PageView,它将使用具有可配置命中测试行为的自定义 Scrollable。完成后,我将发布解决方案的答案。
    • 祝你好运,因为我不知道这是否可能(如果它会在 2 年前的问题中发布:))
    • 由于您不应该在颤振中扩展小部件,我刚刚制作了 Scrollable 类的副本并进行了必要的修改。之后,您使用这个新的 Scrollable 创建一个 PageView 的副本。差不多就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多