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>
This commit is contained in:
parent
b1d9b30b29
commit
d82efa2ced
3 changed files with 71 additions and 40 deletions
|
|
@ -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…
Add table
Reference in a new issue