mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 16:05:18 +00:00
98 lines
3.1 KiB
Dart
98 lines
3.1 KiB
Dart
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
|
|
|
class _TextEditingControllerHookCreator {
|
|
const _TextEditingControllerHookCreator();
|
|
|
|
/// Creates a [TextEditingController] that will be disposed automatically.
|
|
///
|
|
/// The [text] parameter can be used to set the initial value of the
|
|
/// controller.
|
|
TextEditingController call({String? text, List<Object?>? keys}) {
|
|
return use(_TextEditingControllerHook(text, keys));
|
|
}
|
|
|
|
/// Creates a [TextEditingController] from the initial [value] that will
|
|
/// be disposed automatically.
|
|
TextEditingController fromValue(
|
|
TextEditingValue value, [
|
|
List<Object?>? keys,
|
|
]) {
|
|
return use(_TextEditingControllerHook.fromValue(value, keys));
|
|
}
|
|
}
|
|
|
|
/// Creates a [TextEditingController], either via an initial text or an initial
|
|
/// [TextEditingValue].
|
|
///
|
|
/// To use a [TextEditingController] with an optional initial text, use:
|
|
/// ```dart
|
|
/// final controller = useTextEditingController(text: 'initial text');
|
|
/// ```
|
|
///
|
|
/// To use a [TextEditingController] with an optional initial value, use:
|
|
/// ```dart
|
|
/// final controller = useTextEditingController
|
|
/// .fromValue(TextEditingValue.empty);
|
|
/// ```
|
|
///
|
|
/// Changing the text or initial value after the widget has been built has no
|
|
/// effect whatsoever. To update the value in a callback, for instance after a
|
|
/// button was pressed, use the [TextEditingController.text] or
|
|
/// [TextEditingController.value] setters. To have the [TextEditingController]
|
|
/// reflect changing values, you can use [useEffect]. This example will update
|
|
/// the [TextEditingController.text] whenever a provided [ValueListenable]
|
|
/// changes:
|
|
/// ```dart
|
|
/// final controller = useTextEditingController();
|
|
/// final update = useValueListenable(myTextControllerUpdates);
|
|
///
|
|
/// useEffect(() {
|
|
/// controller.text = update;
|
|
/// }, [update]);
|
|
/// ```
|
|
///
|
|
/// See also:
|
|
/// - [TextEditingController], which this hook creates.
|
|
const useShadcnTextEditingController = _TextEditingControllerHookCreator();
|
|
|
|
class _TextEditingControllerHook extends Hook<TextEditingController> {
|
|
const _TextEditingControllerHook(
|
|
this.initialText, [
|
|
List<Object?>? keys,
|
|
]) : initialValue = null,
|
|
super(keys: keys);
|
|
|
|
const _TextEditingControllerHook.fromValue(
|
|
TextEditingValue this.initialValue, [
|
|
List<Object?>? keys,
|
|
]) : initialText = null,
|
|
super(keys: keys);
|
|
|
|
final String? initialText;
|
|
final TextEditingValue? initialValue;
|
|
|
|
@override
|
|
_TextEditingControllerHookState createState() {
|
|
return _TextEditingControllerHookState();
|
|
}
|
|
}
|
|
|
|
class _TextEditingControllerHookState
|
|
extends HookState<TextEditingController, _TextEditingControllerHook> {
|
|
late final _controller = hook.initialValue != null
|
|
? TextEditingController.fromValue(
|
|
hook.initialValue ?? TextEditingValue.empty,
|
|
)
|
|
: TextEditingController(text: hook.initialText);
|
|
|
|
@override
|
|
TextEditingController build(BuildContext context) => _controller;
|
|
|
|
@override
|
|
void dispose() => _controller.dispose();
|
|
|
|
@override
|
|
String get debugLabel => 'useTextEditingController';
|
|
}
|