Как обрабатывать несколько флажков из Listview.builder?

#flutter #flutter-listview

#flutter #dart #флажок #flutter-listview

Вопрос:

У меня есть ListView.builder, который возвращает флажок и его метку. Этот listview вернет список флажков и меток, которые будут отображаться на экране. В настоящее время я просто создаю глобальную переменную IsChecked и изменяю значение флажка с помощью обратного вызова OnChanged и этого значения. Но это изменяет значения всех флажков, присутствующих на экране.

Мне нужен способ обработки каждого флажка по отдельности без изменения других значений флажков. А также вести подсчет отмеченных флажков. Для этого я использую виджет checkboxtile.

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

1. Короткий ответ: с индексом связанного элемента. Для длинного ответа, пожалуйста, предоставьте свой вопрос с некоторым кодом, который у вас уже есть.

Ответ №1:

Вы можете изменить свой IsChecked bool на список bool следующим образом :

 List<bool> isChecked = List.generate(_len, (index) => false);
 

Вы можете подсчитать количество установленных флажков следующим образом :

 isChecked.where((check) => check == true).length
 

Вы можете подсчитать количество непроверенных флажков следующим образом :

 isChecked.where((check) => check == false).length
 

Пожалуйста, ознакомьтесь с приведенным ниже кодом, в котором флажок установлен / снят в заголовке приложения.

 import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static int _len = 10;
  List<bool> isChecked = List.generate(_len, (index) => false);
  String _getTitle() =>
      "Checkbox Demo : Checked = ${isChecked.where((check) => check == true).length}, Unchecked = ${isChecked.where((check) => check == false).length}";
  String _title = "Checkbox Demo";
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('$_title'),
      ),
      body: ListView.builder(
        itemCount: _len,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text("Item $index"),
            trailing: Checkbox(
                onChanged: (checked) {
                  setState(
                    () {
                      isChecked[index] = checked;
                      _title = _getTitle();
                    },
                  );
                },
                value: isChecked[index]),
          );
        },
      ),
    );
  }
}
 

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

1. Как я могу получить индексы отмеченных в этом?

Ответ №2:

Поскольку вы не предоставили никакого общего доступа к коду, я предполагаю, что у вас есть одна переменная isChecked . Но у вас должен быть список isChecked , чтобы вы могли хранить их отдельно.

 List<bool> isChecked = List<bool>.generate(length, index => false);

ListView.builder(
  itemCounter: length,
  itemBuilder: (BuildContext context,int index){ 
      return Checkboxtile ( 
        title: 'label', 
        value: isChecked[index],
        onChanged: (newValue) {
          setState(() {
            isChecked[index] = newValue;
          }); 
        },
      ); 
    } 
 

Чтобы вычислить no. отмеченного флажка:

 int _checkedBox = 0;
for (int i = 0; i < isChecked.length; i  ) 
  if (isChecked[i])
    _checkedBox  ;
 

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

1. есть ли какой-либо способ подсчитать и эти отмеченные флажки?