无法更新方法上textfield中具有set状态的列表



当我在TextField中输入值时,我想更新类型为SongModel的列表。但是,当调用onChanged时,列表不会更新。

List<SongModel> songs = item.data!;
List<SongModel> filterSongs = [];
//showing the songs
return Column(
mainAxisSize: MainAxisSize.max,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
keyboardType: TextInputType.text,
controller: searchController,
onChanged: (value) {
//pass value for the search
getSearch(filterSongs,songs);
},
decoration: InputDecoration(............

getSearch():

getSearch(List<SongModel> filterSongs,List<SongModel> songs)
{
var text = searchController.text;
if (text.isEmpty) {
setState(() {
filterSongs = songs;
});
}
print(songs.where((SongModel item) => item.title.toLowerCase().contains(text.toLowerCase())).toList());
print(text);
setState(() {
// search = text;
filterSongs = songs.where((SongModel item) => item.title.toLowerCase().contains(text.toLowerCase())).toList();
});
print(filterSongs.length);
}

这里的列表不是用set state方法更新的。

getSearch方法中,您设置的是传递给getSearch的参数值,而不是该方法之外的列表值。无论如何,您应该将filterSongs列表声明移到build方法之外,这样它就不会在每次重新生成屏幕时重新声明。

class MyScreenClassState extends State<MyScreenClass>{
//Create State method here

List<SongModel> filterSongs = [];
//Build method here
}
getSearch(List<SongModel> songs)
{
var text = searchController.text;
if (text.isEmpty) {
setState(() {
filterSongs = songs;
});
}
print(songs.where((SongModel item) => item.title.toLowerCase().contains(text.toLowerCase())).toList());
print(text);
setState(() {
// search = text;
filterSongs = songs.where((SongModel item) => item.title.toLowerCase().contains(text.toLowerCase())).toList();
});
print(filterSongs.length);
}

如果onChanged方法不适用于您的实现,您可以尝试这种结构,我想我会为您工作的。

final TextEditingController _controller = TextEditingController();

@override
void initState() {
super.initState();
_controller.addListener(_onControllerChange);

}
@override
void dispose() {
super.dispose();
_controller.dispose();
}
void _onControllerChange() async {
.....

}

最新更新