I am iterating through a list to get an item which has bool value false.
Class:
class Words {
String alphabet;
String word;
String wordtype;
String image;
bool used;
Words({
required this.alphabet,
required this.word,
required this.wordtype,
required this.image,
required this.used,
});
}
Following is the sample data being used
List<Words> initData = [
Words(
alphabet: 'a',
word: 'apple',
wordtype: 'fruit',
image: 'assets/res/apple.jpg',
used: false),
Words(
alphabet: 'a',
word: 'ant',
wordtype: 'insect',
image: 'assets/res/ant.jpg',
used: false),
Words(
alphabet: 'a',
word: 'axe',
wordtype: 'object',
image: 'assets/res/axe.jpg',
used: false),
Words(
alphabet: 'a',
word: 'arrow',
wordtype: 'object',
image: 'assets/res/arrow.jpg',
used: false),
Words(
alphabet: 'a',
word: 'airplane',
wordtype: 'object',
image: 'assets/res/airplane.jpg',
used: false),
Words(
alphabet: 'a',
word: 'anchor',
wordtype: 'object',
image: 'assets/res/anchor.jpg',
used: false),
Words(
alphabet: 'a',
word: 'alligator',
wordtype: 'animal',
image: 'assets/res/alligator.jpg',
used: false),
];
Calling Widget
class WordsWidget extends StatelessWidget {
final homeCtrl = Get.find<HomeController>();
WordsWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
print(homeCtrl.nextWord());
return Container();
}
}
Following function iterates, if all words have been used it resets them and iterates again.
Functions:
nextWord() {
Words nextword =
Words(alphabet: '', word: '', wordtype: '', image: '', used: false);
bool found = false;
for (var i = 0; i < words.length; i ) {
if (words[i].used == false && found != true) {
nextword = words[i];
words[i].used = true;
found = true;
}
}
if (found == false) {
print("resetting");
resetWords();
} else {
print("Found = true so now returning");
print(nextword.word);
return nextword.word;
}
}
void resetWords() {
for (var a = 0; a < words.length; a ) {
words[a].used = false;
}
nextWord();
}
The above works fine till it resets. After reset even though print above return shows the value but when I print the same on calling widget it returns null. Following is the output to illustrate the issue.
flutter: Found = true so now returning
2 flutter: arrow
flutter: Found = true so now returning
2 flutter: airplane
flutter: Found = true so now returning
2 flutter: anchor
flutter: Found = true so now returning
2 flutter: alligator
flutter: resetting
flutter: Found = true so now returning
flutter: apple
flutter: null
As you can see from above, after the word alligator it resets it self and sets used = false for all words. It then searches for the next word in iteration and it has found the word apple but the widget which called the function still returns null.
I would appreciate if someone could highlight what I am doing wrong. Thank you.
CodePudding user response:
There are two main issues with your current code
It will run into an infinite recursion (and thus an exception) if your list of
wordsis empty.In case, you didn't find a usable word in your
forloop you don't return anything ...
nextWord() {
// if there are no available words, don't need to do anything
if (words.length == 0) {
return null;
}
for (int i = 0; i < words.length; i ) {
//when you found an unused word, set the flag and return the word
if (!words[i].used) {
words[i].used = true;
return words[i].word;
}
}
//in case you didn't find anything, return the result of resetWords
return resetWords();
}
resetWords() {
//reset the flags
for (int i = 0; i < words.length; i ) {
words[i].used = false;
}
//and call nextWord again, and return its result
return nextWord();
}
