Skip to content

Commit

Permalink
chore: add input controller and keyboard service
Browse files Browse the repository at this point in the history
  • Loading branch information
ice-hector committed Dec 11, 2023
1 parent 7ec5da9 commit 11f453b
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 0 deletions.
18 changes: 18 additions & 0 deletions lib/app/services/keyboard_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';

class KeyboardService {
final KeyboardVisibilityController keyboardVisibilityController =
KeyboardVisibilityController();
final ValueNotifier<bool> isKeyboardVisible = ValueNotifier<bool>(false);

void init() {
keyboardVisibilityController.onChange.listen((bool visible) {
isKeyboardVisible.value = visible;
});
}

void dispose() {
isKeyboardVisible.dispose();
}
}
70 changes: 70 additions & 0 deletions lib/app/shared/widgets/inputs/input_field_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import 'package:flutter/material.dart';
import 'package:ice/app/services/keyboard_service.dart';

class InputFieldController {
InputFieldController({
FocusNode? focusNode,
this.enabled = true,
required this.widgetKey,
this.scrollToOnFocusKey,
}) : focusNode = focusNode ?? FocusNode();

final FocusNode focusNode;
final bool enabled;
final GlobalKey widgetKey;
final GlobalKey? scrollToOnFocusKey;

double scrollPadding = 0.0;

InputFieldState get _state {
if (!enabled) {
return InputFieldState.disabled;
} else if (focusNode.hasFocus) {
return InputFieldState.focused;
} else {
return InputFieldState.enabled;
}
}

void _updateState() {
state = _state;
}

InputFieldState state = InputFieldState.enabled;

void onInit() {
focusNode.addListener(_updateState);

if (scrollToOnFocusKey != null) {
final KeyboardService keyboardController = KeyboardService();

keyboardController.isKeyboardVisible.addListener(() async {
if (keyboardController.isKeyboardVisible.value) {
await Future<void>.delayed(const Duration(milliseconds: 50));

final RenderBox? box1 =
widgetKey.currentContext?.findRenderObject() as RenderBox?;
final RenderBox? box2 = scrollToOnFocusKey!.currentContext
?.findRenderObject() as RenderBox?;

if (box1 != null && box2 != null) {
final double distance = _getYPosition(box1) - _getYPosition(box2);

if (distance > 0) {
scrollPadding = distance;
}
}
}
});
}
}

static double _getYPosition(RenderBox box) =>
box.globalToLocal(Offset.zero).dy - box.size.height;
}

enum InputFieldState {
enabled,
disabled,
focused,
}
1 change: 1 addition & 0 deletions lib/app/shared/widgets/inputs/text_fields.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

48 changes: 48 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,54 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.20.3"
flutter_keyboard_visibility:
dependency: "direct main"
description:
name: flutter_keyboard_visibility
sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb"
url: "https://pub.dev"
source: hosted
version: "5.4.1"
flutter_keyboard_visibility_linux:
dependency: transitive
description:
name: flutter_keyboard_visibility_linux
sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
flutter_keyboard_visibility_macos:
dependency: transitive
description:
name: flutter_keyboard_visibility_macos
sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086
url: "https://pub.dev"
source: hosted
version: "1.0.0"
flutter_keyboard_visibility_platform_interface:
dependency: transitive
description:
name: flutter_keyboard_visibility_platform_interface
sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4
url: "https://pub.dev"
source: hosted
version: "2.0.0"
flutter_keyboard_visibility_web:
dependency: transitive
description:
name: flutter_keyboard_visibility_web
sha256: d3771a2e752880c79203f8d80658401d0c998e4183edca05a149f5098ce6e3d1
url: "https://pub.dev"
source: hosted
version: "2.0.0"
flutter_keyboard_visibility_windows:
dependency: transitive
description:
name: flutter_keyboard_visibility_windows
sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73
url: "https://pub.dev"
source: hosted
version: "1.0.0"
flutter_lints:
dependency: "direct dev"
description:
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ dependencies:
cupertino_icons: ^1.0.6
image_picker: ^1.0.4
image_cropper: ^5.0.0
flutter_keyboard_visibility: ^5.4.1

dev_dependencies:
flutter_test:
Expand Down

0 comments on commit 11f453b

Please sign in to comment.