Commit ed090f7
Changed files (2)
lib
components
screens
lib/components/settings_widgets.dart
@@ -239,7 +239,7 @@ class _SliderSettingsTileState extends State<SliderSettingsTile> {
}
}
-class InputSettingsTile extends StatelessWidget {
+class InputSettingsTile extends StatefulWidget {
final Widget title;
final Widget? leading;
final Widget? description;
@@ -248,40 +248,57 @@ class InputSettingsTile extends StatelessWidget {
final double inputWidth;
final String? initialValue;
final InputDecoration? decoration;
- final String? Function(String?)? validator;
+ final void Function(String?)? onEditingComplete;
final TextInputType? keyboardType;
final List<TextInputFormatter>? inputFormatters;
- const InputSettingsTile({super.key, required this.title, required this.inputWidth, this.leading, this.description, this.disabled = false, this.initialValue, this.decoration, this.validator, this.keyboardType, this.inputFormatters});
+ const InputSettingsTile({super.key, required this.title, required this.inputWidth, this.leading, this.description, this.disabled = false, this.initialValue, this.decoration, this.onEditingComplete, this.keyboardType, this.inputFormatters});
+
+ @override
+ State<StatefulWidget> createState() => _InputSettingsTileState();
+}
+
+class _InputSettingsTileState extends State<InputSettingsTile> {
+ late String _value;
+
+ @override
+ void initState() {
+ super.initState();
+ _value = widget.initialValue ?? "";
+ }
@override
Widget build(BuildContext context) {
final focusNode = FocusNode();
return SettingsTile(
- title: title,
- description: description,
+ title: widget.title,
+ description: widget.description,
+ leading: widget.leading,
+ disabled: widget.disabled,
onPressed: (context) {
focusNode.requestFocus();
},
trailing: Row(
children: [
SizedBox(
- width: inputWidth,
+ width: widget.inputWidth,
child: TextFormField(
- initialValue: initialValue,
- decoration: decoration,
- validator: validator,
- keyboardType: keyboardType,
- inputFormatters: inputFormatters,
+ initialValue: widget.initialValue,
+ decoration: widget.decoration,
+ onChanged: (value) {
+ _value = value;
+ },
+ onEditingComplete: () => widget.onEditingComplete!(_value),
+ onTapOutside: (e) => widget.onEditingComplete!(_value),
+ keyboardType: widget.keyboardType,
+ inputFormatters: widget.inputFormatters,
focusNode: focusNode,
),
),
const SizedBox(width: 20,),
],
),
- leading: leading,
- disabled: disabled,
);
}
}
lib/screens/settings.dart
@@ -3,6 +3,7 @@ import 'package:blood_pressure_app/model/blood_pressure.dart';
import 'package:blood_pressure_app/model/settings_store.dart';
import 'package:blood_pressure_app/screens/enter_timeformat.dart';
import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
@@ -98,13 +99,95 @@ class SettingsPage extends StatelessWidget {
),
]
),
+ SettingsSection(
+ title: const Text('behavior'),
+ children: [
+ InputSettingsTile(
+ title: const Text('age'),
+ description: const Text('determines warn values'),
+ leading: const Icon(Icons.manage_accounts_outlined),
+ keyboardType: TextInputType.number,
+ inputFormatters: [
+ FilteringTextInputFormatter.digitsOnly
+ ],
+ initialValue: settings.age.toString(),
+ onEditingComplete: (String? value) {
+ if (value == null || value.isEmpty
+ || (int.tryParse(value) == null)) {
+ return;
+ }
+ settings.age = int.tryParse(value) as int; // no error possible as per above's condition
+ },
+ decoration: const InputDecoration(
+ hintText: 'age'
+ ),
+ inputWidth: 80,
+ disabled: false,
+ // although no function provided, when overriding warn values,
+ // this field intentionally doesn't get disabled, as this
+ // would cause unexpected jumps in layout
+ ),
+ SwitchSettingsTile(
+ initialValue: settings.overrideWarnValues,
+ onToggle: (value) {
+ settings.overrideWarnValues = value;
+ },
+ leading: const Icon(Icons.tune),
+ title: const Text('override warn values'),
+ ),
+ InputSettingsTile(
+ title: const Text('systolic warn'),
+ leading: const Icon(Icons.settings_applications_outlined),
+ keyboardType: TextInputType.number,
+ inputFormatters: [
+ FilteringTextInputFormatter.digitsOnly
+ ],
+ initialValue: settings.sysWarn.toString(),
+ onEditingComplete: (String? value) {
+ if (value == null || value.isEmpty
+ || (double.tryParse(value) == null)) {
+ return;
+ }
+ // no error possible as per above's condition
+ settings.sysWarn = double.tryParse(value) as double;
+ },
+ decoration: const InputDecoration(
+ hintText: 'systolic warn'
+ ),
+ inputWidth: 120,
+ disabled: !settings.overrideWarnValues,
+ ),
+ InputSettingsTile(
+ title: const Text('diastolic warn'),
+ leading: const Icon(Icons.settings_applications_outlined),
+ keyboardType: TextInputType.number,
+ inputFormatters: [
+ FilteringTextInputFormatter.digitsOnly
+ ],
+ initialValue: settings.diaWarn.toString(),
+ onEditingComplete: (String? value) {
+ if (value == null || value.isEmpty
+ || (double.tryParse(value) == null)) {
+ return;
+ }
+ // no error possible as per above's condition
+ settings.diaWarn = double.tryParse(value) as double;
+ },
+ decoration: const InputDecoration(
+ hintText: 'diastolic warn'
+ ),
+ inputWidth: 120,
+ disabled: !settings.overrideWarnValues,
+ ),
+ ]
+ ),
SettingsSection(
title: const Text('data'),
children: [
SwitchSettingsTile(
initialValue: settings.useExportCompatability,
title: const Text('compatability export'),
- description: const Text('sets export mime type to text instead of csv'),
+ description: const Text('sets export mime type to text'),
leading: const Icon(Icons.support),
onToggle: (value) {
settings.useExportCompatability = value;