Я пытаюсь сделать свой ListView более интуитивно понятным, предоставляя пользователю возможность визуального выбора самой карты и изменения цвета фона на основе этого выбора. Вот мой код ... У меня проблемы с виджетом buildStudentCard. Я не уверен, как получить правильный индекс из моего снимка студента, чтобы выбрать правильный индекс при выборе.
int _selectedIndex = 0;
_onSelected(int index) {
setState(() => _selectedIndex = index);
}
void showSelectUserDialog(BuildContext context) {
var selectUserDialog = AlertDialog(
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
width: 600.0,
height: 400.0,
child: StreamBuilder(
stream: getUsersStudentsStreamSnapshots(context),
builder: (context, snapshot) {
if (!snapshot.hasData) return const Text("Loading...");
return ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (BuildContext context, int index) =>
buildStudentCard(
context, snapshot.data.documents[index]),
);
}),
),
RaisedButton(
color: Colors.blue[400],
child: Text(
'Dismiss',
style: TextStyle(color: Colors.white),
),
onPressed: () => Navigator.pop(context)),
],
),
);
showDialog(
context: context,
builder: (BuildContext context) {
return selectUserDialog;
});
}
Stream<QuerySnapshot> getUsersStudentsStreamSnapshots(
BuildContext context) async* {
final uid = Provider.of<User>(context).uid;
yield* Firestore.instance
.collection('userData')
.document(uid)
.collection('students')
.snapshots();
}
Widget buildStudentCard(BuildContext context, DocumentSnapshot student) {
return new Container(
color: _selectedIndex != null && _selectedIndex == index //This index is the issue
? Colors.red
: Colors.white,
child: Card(
elevation: 8.0,
child: ListTile(
leading: Icon(Icons.person),
title: Text(
student['firstName'] + ' ' + student['lastName'],
style: TextStyle(fontSize: 25.0),
),
onTap: () => _onSelected(index), //This is another place I'm having trouble
)));
}