Skip to content

CarouselView is not scrollable with mouse #154618

Closed

Description

@PhilipSA

Steps to reproduce

  1. Open https://api.flutter.dev/flutter/material/CarouselView-class.html in your web browser on a device with mouse
  2. Run the Carousel Sample
  3. Try to Scroll/drag to the last item in the carousel (item 20)

I also attempted an implementation in my local app and ran into the same issue.

Expected results

CarouselView behaves similiar to a ListView when attempting to scroll just like the documentation says.

Actual results

Nothing happens when attempting to drag scroll or using mouse wheel.

Code sample

Code sample
import 'package:flutter/material.dart';

/// Flutter code sample for [Carousel].

void main() => runApp(const CarouselExampleApp());

class CarouselExampleApp extends StatelessWidget {
  const CarouselExampleApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Carousel Sample'),
        ),
        body: const CarouselExample(),
      ),
    );
  }
}

class CarouselExample extends StatefulWidget {
  const CarouselExample({super.key});

  @override
  State<CarouselExample> createState() => _CarouselExampleState();
}

class _CarouselExampleState extends State<CarouselExample> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: ConstrainedBox(
        constraints: const BoxConstraints(maxHeight: 200),
        child: CarouselView(
          itemExtent: 330,
          shrinkExtent: 200,
          children: List<Widget>.generate(20, (int index) {
            return UncontainedLayoutCard(index: index, label: 'Item $index');
          }),
        ),
      ),
    );
  }
}

class UncontainedLayoutCard extends StatelessWidget {
  const UncontainedLayoutCard({
    super.key,
    required this.index,
    required this.label,
  });

  final int index;
  final String label;

  @override
  Widget build(BuildContext context) {
    return ColoredBox(
      color: Colors.primaries[index % Colors.primaries.length].withOpacity(0.5),
      child: Center(
        child: Text(
          label,
          style: const TextStyle(color: Colors.white, fontSize: 20),
          overflow: TextOverflow.clip,
          softWrap: false,
        ),
      ),
    );
  }
}

Screenshots or Video

Screenshots / Video demonstration

[Upload media here]

Logs

Logs
[Paste your logs here]

Flutter Doctor output

Doctor output
[√] Flutter (Channel stable, 3.24.1, on Microsoft Windows [Version 10.0.22631.4037], locale sv-SE)
    • Flutter version 3.24.1 on channel stable at D:\projekt\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 5874a72aa4 (2 weeks ago), 2024-08-20 16:46:00 -0500
    • Engine revision c9b9d5780d
    • Dart version 3.5.1
    • DevTools version 2.37.2

[√] Windows Version (Installed version of Windows is version 10 or higher)

[√] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
    • Android SDK at C:\Users\Name\AppData\Local\Android\sdk
    • Platform android-34, build-tools 34.0.0
    • Java binary at: D:\Android\Android Studio\jbr\bin\java
    • Java version OpenJDK Runtime Environment (build 17.0.11+0--11852314)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

[√] Visual Studio - develop Windows apps (Visual Studio Community 2022 17.8.1)
    • Visual Studio at C:\Program Files\Microsoft Visual Studio\2022\Community
    • Visual Studio Community 2022 version 17.8.34316.72
    • Windows 10 SDK version 10.0.19041.0

[√] Android Studio (version 2024.1)
    • Android Studio at D:\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.11+0--11852314)

[√] IntelliJ IDEA Community Edition (version 2022.3)
    • IntelliJ at C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.3
    • Flutter plugin version 71.2.6
    • Dart plugin version 223.8214.16

[√] VS Code, 64-bit edition (version 1.92.2)
    • VS Code at C:\Program Files\Microsoft VS Code
    • Flutter extension version 3.96.0

[√] Connected device (4 available)
    • sdk gphone64 x86 64 (mobile) • emulator-5554 • android-x64    • Android 13 (API 33) (emulator)
    • Windows (desktop)            • windows       • windows-x64    • Microsoft Windows [Version 10.0.22631.4037]
    • Chrome (web)                 • chrome        • web-javascript • Google Chrome 128.0.6613.119
    • Edge (web)                   • edge          • web-javascript • Microsoft Edge 128.0.2739.42

[√] Network resources
    • All expected network resources are available.

Activity

  1. deleted a comment from on Sep 4, 2024
  2. danagbemava-nc commented on Sep 4, 2024

    @danagbemava-nc
    Member

    Hi @PhilipSA, to support drag scrolling you need to implement a custom scroll behavior. See https://docs.flutter.dev/release/breaking-changes/default-scroll-behavior-drag

    Can you try the sample below to see if it solves your issue?

    code sample
    import 'package:flutter/material.dart';
    import 'package:flutter/gestures.dart';
    
    /// Flutter code sample for [Carousel].
    
    class MyCustomScrollBehavior extends MaterialScrollBehavior {
      // Override behavior methods and getters like dragDevices
      @override
      Set<PointerDeviceKind> get dragDevices => {
            PointerDeviceKind.touch,
            PointerDeviceKind.mouse,
            // etc.
          };
    }
    
    // Set ScrollBehavior for an entire application.
    
    void main() => runApp(const CarouselExampleApp());
    
    class CarouselExampleApp extends StatelessWidget {
      const CarouselExampleApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          scrollBehavior: MyCustomScrollBehavior(),
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Carousel Sample'),
            ),
            body: const CarouselExample(),
          ),
        );
      }
    }
    
    class CarouselExample extends StatefulWidget {
      const CarouselExample({super.key});
    
      @override
      State<CarouselExample> createState() => _CarouselExampleState();
    }
    
    class _CarouselExampleState extends State<CarouselExample> {
      @override
      Widget build(BuildContext context) {
        return Center(
          child: ConstrainedBox(
            constraints: const BoxConstraints(maxHeight: 200),
            child: CarouselView(
              itemExtent: 330,
              shrinkExtent: 200,
              children: List<Widget>.generate(20, (int index) {
                return UncontainedLayoutCard(index: index, label: 'Item $index');
              }),
            ),
          ),
        );
      }
    }
    
    class UncontainedLayoutCard extends StatelessWidget {
      const UncontainedLayoutCard({
        super.key,
        required this.index,
        required this.label,
      });
    
      final int index;
      final String label;
    
      @override
      Widget build(BuildContext context) {
        return ColoredBox(
          color: Colors.primaries[index % Colors.primaries.length].withOpacity(0.5),
          child: Center(
            child: Text(
              label,
              style: const TextStyle(color: Colors.white, fontSize: 20),
              overflow: TextOverflow.clip,
              softWrap: false,
            ),
          ),
        );
      }
    }
  3. added
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Sep 4, 2024
  4. PhilipSA commented on Sep 4, 2024

    @PhilipSA
    Author

    Hi @PhilipSA, to support drag scrolling you need to implement a custom scroll behavior. See https://docs.flutter.dev/release/breaking-changes/default-scroll-behavior-drag

    Can you try the sample below to see if it solves your issue?
    code sample

    import 'package:flutter/material.dart';
    import 'package:flutter/gestures.dart';
    
    /// Flutter code sample for [Carousel].
    
    class MyCustomScrollBehavior extends MaterialScrollBehavior {
      // Override behavior methods and getters like dragDevices
      @override
      Set<PointerDeviceKind> get dragDevices => {
            PointerDeviceKind.touch,
            PointerDeviceKind.mouse,
            // etc.
          };
    }
    
    // Set ScrollBehavior for an entire application.
    
    void main() => runApp(const CarouselExampleApp());
    
    class CarouselExampleApp extends StatelessWidget {
      const CarouselExampleApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          scrollBehavior: MyCustomScrollBehavior(),
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Carousel Sample'),
            ),
            body: const CarouselExample(),
          ),
        );
      }
    }
    
    class CarouselExample extends StatefulWidget {
      const CarouselExample({super.key});
    
      @override
      State<CarouselExample> createState() => _CarouselExampleState();
    }
    
    class _CarouselExampleState extends State<CarouselExample> {
      @override
      Widget build(BuildContext context) {
        return Center(
          child: ConstrainedBox(
            constraints: const BoxConstraints(maxHeight: 200),
            child: CarouselView(
              itemExtent: 330,
              shrinkExtent: 200,
              children: List<Widget>.generate(20, (int index) {
                return UncontainedLayoutCard(index: index, label: 'Item $index');
              }),
            ),
          ),
        );
      }
    }
    
    class UncontainedLayoutCard extends StatelessWidget {
      const UncontainedLayoutCard({
        super.key,
        required this.index,
        required this.label,
      });
    
      final int index;
      final String label;
    
      @override
      Widget build(BuildContext context) {
        return ColoredBox(
          color: Colors.primaries[index % Colors.primaries.length].withOpacity(0.5),
          child: Center(
            child: Text(
              label,
              style: const TextStyle(color: Colors.white, fontSize: 20),
              overflow: TextOverflow.clip,
              softWrap: false,
            ),
          ),
        );
      }
    }

    Yes this solved the problem thanks; i was totally unaware of this behavior.

  5. removed
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Sep 4, 2024
  6. danagbemava-nc commented on Sep 5, 2024

    @danagbemava-nc
    Member

    Closing this as solved

  7. added
    r: solvedIssue is closed as solved
    and removed
    in triagePresently being triaged by the triage team
    on Sep 5, 2024
  8. github-actions commented on Sep 19, 2024

    @github-actions

    This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of flutter doctor -v and a minimal reproduction of the issue.

  9. locked as resolved and limited conversation to collaborators on Sep 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    r: solvedIssue is closed as solved

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions