【发布时间】:2020-12-03 05:58:44
【问题描述】:
我在 Flutter 中创建了一个列表视图,它从 Firestore 中提取数据。到这里它工作正常,但现在我想使用下拉列表添加一些过滤器,它将根据用户选择的下拉值过滤列表视图。所以现在当应用程序第一次加载时,listview 正确出现,但是当我更改下拉列表中的值时,列表不会改变。 当用户选择下拉值时,我想更新列表视图。
这是我有两个过滤器(下拉值)的应用栏。并且当用户想要更改过滤器值(从下拉列表中)时,应该更新列表。
import 'package:cloud_firestore/cloud_firestore.dart';
class LandingPage extends StatefulWidget {
@override
_LandingPageState createState() => _LandingPageState();
}
String _currentlySelectedage = "2";
String _currentlySelectedlanguage = "english";
class _LandingPageState extends State<LandingPage> {
final List<String> _dropdownValuesage = ["1","2","3"];
final List<String> _dropdownValueslanguage = ["silent", "english","hindi"];
Widget dropdownWidgetage() {
return DropdownButton(
isExpanded: false,
value:_currentlySelectedage,
onChanged: (String newvalue) {
setState(() {
_currentlySelectedage = newvalue;
print(_currentlySelectedage);
});
},
items: _dropdownValuesage
.map((value) => DropdownMenuItem(
child: Text(value),
value: value,
))
.toList(),
);
}
Widget dropdownWidgetlanguage() {
return DropdownButton(
isExpanded: false,
value:_currentlySelectedlanguage,
onChanged: (String newvalue) {
setState(() {
_currentlySelectedlanguage = newvalue;
print(_currentlySelectedlanguage);
});
},
items: _dropdownValueslanguage
.map((value) => DropdownMenuItem(
child: Text(value),
value: value,
))
.toList(),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
centerTitle: false,
title: Text('',style: TextStyle(fontFamily: 'Raleway'),),
backgroundColor: Colors.teal,
actions: <Widget>[
dropdownWidgetage(),
SizedBox(width:4),
dropdownWidgetlanguage()
],
),
body: ListPage(),
);
}
}
class ListPage extends StatefulWidget {
@override
_ListPageState createState() => _ListPageState();
}
class _ListPageState extends State<ListPage> {
Future _data;
Future getPosts() async {
var firestore = Firestore.instance;
QuerySnapshot qn = await firestore
.collection("movies")
.where("age", arrayContains: _currentlySelectedage)
.where("language", isEqualTo: _currentlySelectedlanguage)
.orderBy('rank', descending: true)
.getDocuments();
return qn.documents;
}
navigateToDetail(DocumentSnapshot post) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailPage(
post: post,
)));
}
@override
void initState() {
super.initState();
_data = getPosts();
}
@override
Widget build(BuildContext context) {
return Container(
child: FutureBuilder(
future: _data,
builder: (_, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: Text("Loading...."),
);
} else {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (_, index) {
return Card(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
InkWell(
onTap: () => navigateToDetail(snapshot.data[index]),
child: Image.network(
snapshot.data[index].data['gff']),
),
Text(
snapshot.data[index].data['gfg'],
style: TextStyle(
fontWeight: FontWeight.bold, fontSize: 20),
),
]));
});
}
}),
);
}
}
【问题讨论】:
-
问题是查询的执行只发生了一次,而且在启动应用程序的开始时也是如此。我只想在用户更改下拉值并按下“Go”(我将实现的按钮)时再次执行查询。
标签: flutter listview google-cloud-firestore dropdown