fix: update text controller value when text field value changes (#1637)
This commit is contained in:
parent
4f2475bc5e
commit
3ed92b3411
6 changed files with 37 additions and 47 deletions
|
|
@ -1,4 +1,12 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:get_storage/get_storage.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/pangea/common/config/environment.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||
|
|
@ -7,13 +15,6 @@ import 'package:fluffychat/pangea/learning_settings/utils/language_list_util.dar
|
|||
import 'package:fluffychat/utils/client_manager.dart';
|
||||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
import 'package:fluffychat/widgets/error_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:get_storage/get_storage.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'config/setting_keys.dart';
|
||||
import 'utils/background_push.dart';
|
||||
import 'widgets/fluffy_chat_app.dart';
|
||||
|
|
|
|||
|
|
@ -5,10 +5,23 @@ import 'dart:core';
|
|||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'package:adaptive_dialog/adaptive_dialog.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:device_info_plus/device_info_plus.dart';
|
||||
import 'package:emoji_picker_flutter/emoji_picker_flutter.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:scroll_to_index/scroll_to_index.dart';
|
||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/setting_keys.dart';
|
||||
import 'package:fluffychat/config/themes.dart';
|
||||
|
|
@ -43,18 +56,6 @@ import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
|
|||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
import 'package:fluffychat/widgets/future_loading_dialog.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:scroll_to_index/scroll_to_index.dart';
|
||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
|
||||
import '../../utils/account_bundles.dart';
|
||||
import '../../utils/localized_exception_extension.dart';
|
||||
import 'send_file_dialog.dart';
|
||||
|
|
|
|||
|
|
@ -42,10 +42,6 @@ class ActivityPlannerPageState extends State<ActivityPlannerPage> {
|
|||
/// Index of the content to display
|
||||
_PageMode _pageMode = _PageMode.settings;
|
||||
|
||||
/// Selected values from the form
|
||||
String? _selectedTopic;
|
||||
String? _selectedMode;
|
||||
String? _selectedObjective;
|
||||
MediaEnum _selectedMedia = MediaEnum.nan;
|
||||
String? _selectedLanguageOfInstructions;
|
||||
String? _selectedTargetLanguage;
|
||||
|
|
@ -120,14 +116,14 @@ class ActivityPlannerPageState extends State<ActivityPlannerPage> {
|
|||
}
|
||||
|
||||
void _randomizeSelections() async {
|
||||
_selectedTopic = await _randomTopic();
|
||||
_selectedObjective = await _randomObjective();
|
||||
_selectedMode = await _randomMode();
|
||||
final selectedTopic = await _randomTopic();
|
||||
final selectedObjective = await _randomObjective();
|
||||
final selectedMode = await _randomMode();
|
||||
|
||||
setState(() {
|
||||
_topicController.text = _selectedTopic!;
|
||||
_objectiveController.text = _selectedObjective!;
|
||||
_modeController.text = _selectedMode!;
|
||||
_topicController.text = selectedTopic;
|
||||
_objectiveController.text = selectedObjective;
|
||||
_modeController.text = selectedMode;
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -191,9 +187,9 @@ class ActivityPlannerPageState extends State<ActivityPlannerPage> {
|
|||
activityPlanRequest: _PageMode.savedActivities == _pageMode
|
||||
? null
|
||||
: ActivityPlanRequest(
|
||||
topic: _selectedTopic!,
|
||||
mode: _selectedMode!,
|
||||
objective: _selectedObjective!,
|
||||
topic: _topicController.text,
|
||||
mode: _modeController.text,
|
||||
objective: _objectiveController.text,
|
||||
media: _selectedMedia,
|
||||
languageOfInstructions: _selectedLanguageOfInstructions!,
|
||||
targetLanguage: _selectedTargetLanguage!,
|
||||
|
|
@ -223,8 +219,6 @@ class ActivityPlannerPageState extends State<ActivityPlannerPage> {
|
|||
validator: _validateNotNull,
|
||||
label: l10n.topicLabel,
|
||||
placeholder: l10n.topicPlaceholder,
|
||||
onSelected: (val) => _selectedTopic = val,
|
||||
initialValue: _selectedTopic,
|
||||
controller: _topicController,
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
|
|
@ -234,8 +228,6 @@ class ActivityPlannerPageState extends State<ActivityPlannerPage> {
|
|||
label: l10n.learningObjectiveLabel,
|
||||
placeholder:
|
||||
l10n.learningObjectivePlaceholder,
|
||||
onSelected: (val) => _selectedObjective = val,
|
||||
initialValue: _selectedObjective,
|
||||
controller: _objectiveController,
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
|
|
@ -244,8 +236,6 @@ class ActivityPlannerPageState extends State<ActivityPlannerPage> {
|
|||
validator: _validateNotNull,
|
||||
label: l10n.modeLabel,
|
||||
placeholder: l10n.modePlaceholder,
|
||||
onSelected: (val) => _selectedMode = val,
|
||||
initialValue: _selectedMode,
|
||||
controller: _modeController,
|
||||
),
|
||||
],
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@ class SuggestionFormField extends StatelessWidget {
|
|||
final String? Function(String?)? validator;
|
||||
final String label;
|
||||
final String placeholder;
|
||||
final void Function(String) onSelected;
|
||||
final String? initialValue;
|
||||
final TextEditingController controller;
|
||||
|
||||
const SuggestionFormField({
|
||||
|
|
@ -17,16 +15,13 @@ class SuggestionFormField extends StatelessWidget {
|
|||
required this.placeholder,
|
||||
this.validator,
|
||||
required this.label,
|
||||
required this.onSelected,
|
||||
required this.initialValue,
|
||||
required this.controller,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Autocomplete<String>(
|
||||
initialValue:
|
||||
initialValue != null ? TextEditingValue(text: initialValue!) : null,
|
||||
initialValue: TextEditingValue(text: controller.text),
|
||||
optionsBuilder: (TextEditingValue textEditingValue) async {
|
||||
return (await suggestions)
|
||||
.where((ActivitySettingResponseSchema option) {
|
||||
|
|
@ -35,7 +30,7 @@ class SuggestionFormField extends StatelessWidget {
|
|||
.contains(textEditingValue.text.toLowerCase());
|
||||
}).map((ActivitySettingResponseSchema e) => e.name);
|
||||
},
|
||||
onSelected: onSelected,
|
||||
onSelected: (val) => controller.text = val,
|
||||
fieldViewBuilder: (
|
||||
BuildContext context,
|
||||
TextEditingController textEditingController,
|
||||
|
|
@ -44,7 +39,7 @@ class SuggestionFormField extends StatelessWidget {
|
|||
) {
|
||||
textEditingController.value = controller.value;
|
||||
textEditingController.addListener(() {
|
||||
onSelected(textEditingController.text);
|
||||
controller.value = textEditingController.value;
|
||||
});
|
||||
return TextFormField(
|
||||
controller: textEditingController,
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:material_symbols_icons/symbols.dart';
|
||||
|
||||
const Map<String, List<String>> morphCategoriesAndLabels = {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:get_storage/get_storage.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
||||
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||
|
||||
class CustomizedSvg extends StatelessWidget {
|
||||
/// URL of the SVG file
|
||||
final String svgUrl;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue