Skip to content

Instantly share code, notes, and snippets.

@ThomasAunvik
Last active June 11, 2024 14:02
Show Gist options
  • Save ThomasAunvik/a8d241f3fcc2f73a43b77860e6b5f066 to your computer and use it in GitHub Desktop.
Save ThomasAunvik/a8d241f3fcc2f73a43b77860e6b5f066 to your computer and use it in GitHub Desktop.
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends HookWidget {
const MyApp({super.key});
static const previousValue = 1;
@override
Widget build(BuildContext context) {
final List<int> counts = [];
for (var i = 0; i < 10; i++) {
counts.add(i);
}
final selectedPriority = useState<int?>(null);
final scrollController = useFixedExtentScrollController();
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: SizedBox(
height: 200,
child: ListWheelScrollView(
controller: scrollController,
itemExtent: 25,
squeeze: 0.8,
onSelectedItemChanged: (index) {
print("SelectedValue Changed $index");
selectedPriority.value = index;
},
children: counts
.map(
(count) => count == previousValue
? Text("Currently Selected")
: GestureDetector(
onTap: () {
selectedPriority.value = count;
scrollController.jumpToItem(count);
},
child: Container(
width: 100,
decoration: BoxDecoration(
border: Border.all(
color: selectedPriority.value == count
? Theme.of(context)
.textTheme
.bodyMedium
?.color ??
Colors.black
: Colors.transparent,
),
borderRadius: BorderRadius.circular(20),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [Text("- $count -")],
),
),
),
)
.toList(),
),
),
),
),
);
}
}
/// 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';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment