Last active
June 11, 2024 14:02
-
-
Save ThomasAunvik/a8d241f3fcc2f73a43b77860e6b5f066 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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