Skip to content

PageView with viewportFraction < 1.0 - GestureDetector is not working properly #23873

@rav3r

Description

@rav3r

Internal: b/144873050

Hey, looks like there is a bug preventing gesture detection on right side of the widget inside page view with only one element and viewport fraction smaller than 1.0.

This is how my widget tree looks like:

column
  - page view
    - gesture detector
      - green container
    - gesture detector
      - blue container
  - page view
    - gesture detector
      - red container

screenshot from 2018-11-02 16-14-59

Top gesture detectors (green&blue widgets) work fine, I can click anywhere and I can see debug logs in console.
Bottom gesture detector (red widget) works fine only for left half of the widget. When I click on the right half then onTap callback is not fired. Looks like something is preventing gesture detector from getting input.

flutter doctor output:

[✓] Flutter (Channel beta, v0.9.4, on Linux, locale en_US.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK 27.0.3)
[✓] Android Studio (version 3.1)
[!] IntelliJ IDEA Community Edition (version 2018.2)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] Connected devices (1 available)

Source code to reproduce bug:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Column(children: <Widget>[
        Expanded(
          child: ColorPages(
            colors: <Color>[
              Colors.green,
              Colors.blue,
            ],
          ),
        ),
        Expanded(
          child: ColorPages(
            colors: <Color>[
              Colors.red,
            ],
          ),
        ),
      ]),
    );
  }
}

class ColorPages extends StatefulWidget {
  final List<Color> colors;

  const ColorPages({Key key, this.colors}) : super(key: key);

  @override
  ColorPagesState createState() {
    return new ColorPagesState();
  }
}

class ColorPagesState extends State<ColorPages> {
  PageController _pageController;

  @override
  void initState() {
    super.initState();

    _pageController = new PageController(
      viewportFraction: 0.5,
    );
  }

  @override
  Widget build(BuildContext context) {
    return PageView.builder(
      controller: _pageController,
      itemBuilder: (context, index) {
        return GestureDetector(
          onTap: () {
            print(DateTime.now().toIso8601String() + " " + widget.colors[index].toString());
          },
          child: Container(
            color: widget.colors[index],
          ),
        );
      },
      itemCount: widget.colors.length,
    );
  }
}

Metadata

Metadata

Labels

customer: googleVarious Google teamsf: gesturesflutter/packages/flutter/gestures repository.frameworkflutter/packages/flutter repository. See also f: labels.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions