Flutter — как я могу получить список идентификаторов в lisviw builder

#flutter #dart #google-cloud-firestore

#flutter #dart #google-облако-firestore

Вопрос:

Как я могу получить значение и идентификатор владельца коммутатора listview.builder , я хотел создать коллекцию firebase, в которой будут сохранены значения, и для выполнения этой работы я создал контейнер, который содержит имя и а switch , и я создал listview.builder список всех документов, поэтому, когда я нажимаю отправитьон button отправит все значения переключателя с их идентификаторами

вот listview.builder

 Column(
        children: [
          Expanded(
                      child: ListView.builder(
                        itemCount: posts.length,
                        itemBuilder: (context, index) {
                          return Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Container(
                              child: Padding(
                                padding: const EdgeInsets.fromLTRB(6, 3, 8, 3),
                                child: Row(
                                  crossAxisAlignment: CrossAxisAlignment.center,
                                  children: [
                                    Switch(value: null, onChanged: null),
                                    Text(posts[index].data()["fname"])),
                                  ],
                                ),
                              ),
                            ),
                          );
                        },
                      ),
            ),
            RaisedButton.icon(
              label: Text('Submit', style: TextStyle(color: Colors.white),),
              onPressed: () {},
                            ),
                        ],
                      ),
  

Ответ №1:

Вы можете отслеживать текущие состояния переключателей вне метода сборки с помощью карты. Используйте post.data()[«fname»] в качестве ключа

 var switchStates = {};
  @override
  void initState() {
    super.initState();
    for (var post in posts) {
      switchStates[post.data()["fname"]] = false;
    }
  }

  void onSwitchChanged(var key, var newValue)
  {
    switchStates[key] = newValue;
  }
  

А затем в ListView

  Switch(value: null, onChanged: (value) => onSwitchChanged(posts[index].data()["fname"], value);)
  

Наконец, вы можете получить доступ к идентификаторам и значениям с помощью карты switchStates.

 var keys = switchStates.keys;
var values = switchStates.values; //Use them in onPressed
  

Комментарии:

1. Failed assertion: boolean expression must not be null я получаю эту ошибку на коммутаторе

2. и как я могу установить данные с ключом в качестве поля и значением в качестве значения в firestore

3. Переключатель(значение: false, OnChanged: (значение) => onSwitchChanged(posts[index].data()[«fname»], значение);)

4. когда я делаю его ложным, значение вообще не может быть изменено

5. Вы правы. Определите переменную bool вне конструктора и передайте ее в value: . Не забудьте обновить его значение в методе OnChanged (switchVar = newValue)