Make objective/topic/mode nullable lists instead of async (#3698)

* Make objective/topic/mode nullable lists instead of async

* Check for mount before setting state

---------

Co-authored-by: ggurdin <46800240+ggurdin@users.noreply.github.com>
pull/2245/head
Kelrap 3 months ago committed by GitHub
parent b1d9b30b29
commit d82efa2ced
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -50,6 +50,10 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
String? filename;
List<ActivitySettingResponseSchema>? topicItems;
List<ActivitySettingResponseSchema>? modeItems;
List<ActivitySettingResponseSchema>? objectiveItems;
@override
void initState() {
super.initState();
@ -60,7 +64,9 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
MatrixState.pangeaController.languageController.userL2?.langCode;
selectedCefrLevel = LanguageLevelTypeEnum.a1;
selectedNumberOfParticipants = 3;
_setModeImageURL();
_setMode();
_setTopic();
_setObjective();
}
@override
@ -88,15 +94,6 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
numberOfParticipants: selectedNumberOfParticipants!,
);
Future<List<ActivitySettingResponseSchema>> get topicItems =>
TopicListRepo.get(req);
Future<List<ActivitySettingResponseSchema>> get modeItems =>
ActivityModeListRepo.get(req);
Future<List<ActivitySettingResponseSchema>> get objectiveItems =>
LearningObjectiveListRepo.get(req);
Room? get room => Matrix.of(context).client.getRoomById(widget.roomID);
String? validateNotNull(String? value) {
@ -106,31 +103,33 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
return null;
}
Future<String> _randomTopic() async {
final topics = await topicItems;
return (topics..shuffle()).first.name;
}
String? get _randomTopic => (topicItems?..shuffle())?.first.name;
Future<String> _randomObjective() async {
final objectives = await objectiveItems;
return (objectives..shuffle()).first.name;
}
String? get _randomObjective => (objectiveItems?..shuffle())?.first.name;
Future<String> _randomMode() async {
final modes = await modeItems;
return (modes..shuffle()).first.name;
}
String? get _randomMode => (modeItems?..shuffle())?.first.name;
void randomizeSelections() async {
final selectedTopic = await _randomTopic();
final selectedObjective = await _randomObjective();
final selectedMode = await _randomMode();
bool get randomizeEnabled =>
topicItems != null && objectiveItems != null && modeItems != null;
setState(() {
topicController.text = selectedTopic;
objectiveController.text = selectedObjective;
modeController.text = selectedMode;
});
void randomizeSelections() {
final selectedTopic = _randomTopic;
final selectedObjective = _randomObjective;
final selectedMode = _randomMode;
if (selectedTopic == null ||
selectedObjective == null ||
selectedMode == null) {
return;
}
if (mounted) {
setState(() {
topicController.text = selectedTopic;
objectiveController.text = selectedObjective;
modeController.text = selectedMode;
});
}
}
void clearSelections() async {
@ -164,15 +163,45 @@ class ActivityGeneratorState extends State<ActivityGenerator> {
setState(() => selectedCefrLevel = value);
}
Future<ActivitySettingResponseSchema?> get _selectedMode async {
final modes = await modeItems;
return modes.firstWhereOrNull(
ActivitySettingResponseSchema? get _selectedMode {
return modeItems?.firstWhereOrNull(
(element) => element.name.toLowerCase() == planRequest.mode.toLowerCase(),
);
}
Future<void> _setTopic() async {
final topic = await TopicListRepo.get(req);
if (mounted) {
setState(() {
topicItems = topic;
});
}
}
Future<void> _setMode() async {
final mode = await ActivityModeListRepo.get(req);
if (mounted) {
setState(() {
modeItems = mode;
});
_setModeImageURL();
}
}
Future<void> _setObjective() async {
final objective = await LearningObjectiveListRepo.get(req);
if (mounted) {
setState(() {
objectiveItems = objective;
});
}
}
Future<void> _setModeImageURL() async {
final mode = await _selectedMode;
final mode = _selectedMode;
if (mode == null) return;
final modeName =

@ -254,7 +254,9 @@ class ActivityGeneratorView extends StatelessWidget {
child: Padding(
padding: const EdgeInsets.only(left: 8.0),
child: ElevatedButton(
onPressed: controller.randomizeSelections,
onPressed: controller.randomizeEnabled
? controller.randomizeSelections
: null,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:fluffychat/pangea/activity_generator/list_request_schema.dart';
class SuggestionFormField extends StatelessWidget {
final Future<List<ActivitySettingResponseSchema>> suggestions;
final List<ActivitySettingResponseSchema>? suggestions;
final String? Function(String?)? validator;
final int? maxLength;
final String label;
@ -12,7 +12,7 @@ class SuggestionFormField extends StatelessWidget {
const SuggestionFormField({
super.key,
required this.suggestions,
this.suggestions,
required this.placeholder,
this.validator,
this.maxLength,
@ -24,8 +24,8 @@ class SuggestionFormField extends StatelessWidget {
Widget build(BuildContext context) {
return Autocomplete<String>(
initialValue: TextEditingValue(text: controller.text),
optionsBuilder: (TextEditingValue textEditingValue) async {
return (await suggestions)
optionsBuilder: (TextEditingValue textEditingValue) {
return (suggestions ?? [])
.where((ActivitySettingResponseSchema option) {
return option.name
.toLowerCase()

Loading…
Cancel
Save