Commit 76e5c8d

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-11-14 16:19:28
make back key edit last input field
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 99a6887
Changed files (1)
lib
components
lib/components/dialoges/add_measurement.dart
@@ -33,9 +33,13 @@ class AddMeasurementDialoge extends StatefulWidget {
 
 class _AddMeasurementDialogeState extends State<AddMeasurementDialoge> {
   final formKey = GlobalKey<FormState>();
-  final firstFocusNode = FocusNode();
+  final sysFocusNode = FocusNode();
+  final diaFocusNode = FocusNode();
+  final pulFocusNode = FocusNode();
+  final noteFocusNode = FocusNode();
   late final TextEditingController sysController;
 
+
   /// Currently selected time.
   late DateTime time;
 
@@ -61,17 +65,34 @@ class _AddMeasurementDialogeState extends State<AddMeasurementDialoge> {
     needlePin = widget.initialRecord?.needlePin;
     sysController = TextEditingController(text: (widget.initialRecord?.systolic ?? '').toString());
 
-    firstFocusNode.requestFocus();
+    sysFocusNode.requestFocus();
+    ServicesBinding.instance.keyboard.addHandler(_onKey);
   }
 
 
   @override
   void dispose() {
-    firstFocusNode.dispose();
     sysController.dispose();
+    sysFocusNode.dispose();
+    diaFocusNode.dispose();
+    pulFocusNode.dispose();
+    noteFocusNode.dispose();
+    ServicesBinding.instance.keyboard.removeHandler(_onKey);
     super.dispose();
   }
 
+  bool _onKey(KeyEvent event) {
+    if (event is! KeyDownEvent) return false;
+    final isBackspace = event.logicalKey.keyId == 0x00100000008;
+    if (!isBackspace) return false;
+    formKey.currentState?.save();
+    if (diaFocusNode.hasFocus && diastolic == null 
+        || pulFocusNode.hasFocus && pulse == null
+        || noteFocusNode.hasFocus && (notes?.isEmpty ?? true)
+    ) FocusScope.of(context).previousFocus();
+    return false;
+  }
+
   Widget buildTimeInput(AppLocalizations localizations) =>
     ListTile(
       title: Text(DateFormat(widget.settings.dateFormatString).format(time)),
@@ -200,7 +221,7 @@ class _AddMeasurementDialogeState extends State<AddMeasurementDialoge> {
               mainAxisSize: MainAxisSize.min,
               children: [
                 buildValueInput(localizations,
-                  focusNode: firstFocusNode,
+                  focusNode: sysFocusNode,
                   hintText: localizations.sysLong,
                   controller: sysController,
                   onSaved: (value) => setState(() => systolic = int.tryParse(value ?? '')),
@@ -210,6 +231,7 @@ class _AddMeasurementDialogeState extends State<AddMeasurementDialoge> {
                   hintText: localizations.diaLong,
                   initialValue: widget.initialRecord?.diastolic,
                   onSaved: (value) => setState(() => diastolic = int.tryParse(value ?? '')),
+                  focusNode: diaFocusNode,
                   validator: (value) {
                     if (widget.settings.validateInputs && (int.tryParse(value ?? '') ?? 0) >= (int.tryParse(sysController.text) ?? 1)) {
                       return AppLocalizations.of(context)?.errDiaGtSys;
@@ -221,6 +243,7 @@ class _AddMeasurementDialogeState extends State<AddMeasurementDialoge> {
                 buildValueInput(localizations,
                   hintText: localizations.pulLong,
                   initialValue: widget.initialRecord?.pulse,
+                  focusNode: pulFocusNode,
                   onSaved: (value) => setState(() => pulse = int.tryParse(value ?? '')),
                 ),
               ],
@@ -229,6 +252,7 @@ class _AddMeasurementDialogeState extends State<AddMeasurementDialoge> {
               padding: const EdgeInsets.symmetric(vertical: 16),
               child: TextFormField(
                 initialValue: widget.initialRecord?.notes,
+                focusNode: noteFocusNode,
                 decoration: getInputDecoration(localizations.addNote),
                 minLines: 1,
                 //maxLines: 4, There is a bug in the flutter framework: https://github.com/flutter/flutter/issues/138219