Выбор элемента в StreamBuilder - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь сделать свой 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
            )));
  }
...