带有过滤器的 Flutter Firebase 列表视图
Flutter Firebase listview with filters
我在 flutter 中创建了一个列表视图,它从 firestore 中提取数据。到这里它工作正常,但现在我想使用下拉列表添加一些过滤器,这将根据用户选择的下拉列表值过滤列表视图。所以现在当应用程序第一次加载时,列表视图会正确显示,但是当我更改下拉列表中的值时,列表不会改变。
我想在用户选择下拉值时更新列表视图。
这是我有两个过滤器(下拉值)的应用栏。当用户想要更改过滤器值(从下拉列表中)时,应该更新列表。
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),
),
]));
});
}
}),
);
}
}
Flutter 缓存小部件以避免不必要的重建。当它第二次构建 ListPage()
时,它看到参数没有改变,因为没有参数,并重用第一次构建的缓存版本。将全局变量转换为参数,你应该没问题。
我在 flutter 中创建了一个列表视图,它从 firestore 中提取数据。到这里它工作正常,但现在我想使用下拉列表添加一些过滤器,这将根据用户选择的下拉列表值过滤列表视图。所以现在当应用程序第一次加载时,列表视图会正确显示,但是当我更改下拉列表中的值时,列表不会改变。 我想在用户选择下拉值时更新列表视图。
这是我有两个过滤器(下拉值)的应用栏。当用户想要更改过滤器值(从下拉列表中)时,应该更新列表。
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),
),
]));
});
}
}),
);
}
}
Flutter 缓存小部件以避免不必要的重建。当它第二次构建 ListPage()
时,它看到参数没有改变,因为没有参数,并重用第一次构建的缓存版本。将全局变量转换为参数,你应该没问题。