rrousselGit / flutter_hooks

React hooks for Flutter. Hooks are a new kind of object that manages a Widget life-cycles. They are used to increase code sharing between widgets and as a complete replacement for StatefulWidget.
MIT License
3.13k stars 179 forks source link

Add hook "useFixedExtentScrollController" #433

Closed ThomasAunvik closed 2 months ago

ThomasAunvik commented 3 months ago

Is your feature request related to a problem? Please describe. Add a hook for FixedExtentScrollController

Describe the solution you'd like

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

/// Creates [FixedExtentScrollController] that will be disposed automatically.
///
/// See also:
/// - [FixedExtentScrollController]
FixedExtentScrollController useFixedExtentScrollController({
  int initialItem = 0,
  List<Object?>? keys,
}) {
  return use(
    _FixedExtentScrollControllerHook(
      initialItem: initialItem,
      keys: keys,
    ),
  );
}

class _FixedExtentScrollControllerHook
    extends Hook<FixedExtentScrollController> {
  const _FixedExtentScrollControllerHook({
    required this.initialItem,
    super.keys,
  });

  final int initialItem;

  @override
  HookState<FixedExtentScrollController, Hook<FixedExtentScrollController>>
      createState() => _FixedExtentScrollControllerHookState();
}

class _FixedExtentScrollControllerHookState extends HookState<
    FixedExtentScrollController, _FixedExtentScrollControllerHook> {
  late final controller = FixedExtentScrollController(
    initialItem: hook.initialItem,
  );

  @override
  FixedExtentScrollController build(BuildContext context) => controller;

  @override
  void dispose() => controller.dispose();

  @override
  String get debugLabel => 'useFixedExtentScrollController';
}

Additional context

Example:

ListWheelScrollView(
  controller: scrollController,
  itemExtent: 25,
  squeeze: 0.8,
  onSelectedItemChanged: (value) {
    selected.value = value;
  },
  children: counts.map(
       (index) => OnClick(
           onTap: () {
                 selected.value = index;
                 scrollController.jumpToItem(index);
            },

https://dartpad.dev/?id=a8d241f3fcc2f73a43b77860e6b5f066

rrousselGit commented 2 months ago

Sure. Feel free to raise a PR with the relevant tests