Таблица данных Flutter с переключателем в качестве виджета

Вопрос или проблема

Я хотел бы использовать компонент Switch внутри таблицы данных (DataTable), которая получает данные из другого класса. Проблема в том, что я ссылаюсь в основной таблице на другой класс, чтобы получить данные, и хочу использовать Switch в этой конкретной записи таблицы. Пример: Switch в строке 1 используется для конкретной записи в строке 1. Switch в строке 2 предназначен для записи в строке 2.

вставьте описание изображения здесь

Но как я могу установить Switch в данных, если логика сама находится в другом месте?

Поэтому я создал таблицу данных следующим образом:

Состояние .....
....
class MyCountriesState extends State<MyCountries> {
var test = Dummy();
....
body: SingleChildScrollView(
    scrollDirection: Axis.horizontal,
    child: SizedBox(
      width: 400,
      child: ListView(
        children: [_createDataTable()],
      ),
    ),
   ),
  );
 }

DataTable _createDataTable() {
return DataTable(
  columns: _createColumns(),
  rows: _createRows(),
);
}

List<DataColumn> _createColumns() {
return [
  DataColumn(
    label: Text('Страна'),
  ),
  DataColumn(label: Text('Кнопка')),
];
}

List<DataRow> _createRows() {
return test.countries
    .map((link) => DataRow(cells: [
          DataCell(Text(link['country'])),
          DataCell((link["status"]))
        ]))
     .toList();
  }
  }

Виджет получает свои данные из другого файла dart, который выглядит следующим образом:

import 'package:flutter/material.dart';

class Dummy {
List<Map<String, dynamic>> _countries = [
{
  "country": "Китай",
  "status": Switch(
    inactiveThumbColor: Colors.white,
    activeColor: Colors.white,
    activeTrackColor: Colors.green,
    inactiveTrackColor: Colors.grey,
    value: true,
    onChanged: (value) {},
  ),
  },
  ];
  List<Map<String, dynamic>> get countries => _countries;
  }

Ответ или решение

Для задачи использования виджета Switch в DataTable с данными, полученными из другого класса, необходимо правильно интегрировать состояние переключателя с данными в таблице.

Вот подход к решению этой проблемы:

  1. Измените структуру данных: Вместо хранения Switch как виджета в списке стран, храните только состояние переключателя (true/false).

  2. Создайте метод управления состоянием: Добавьте логику для изменения состояния каждого переключателя, чтобы обновлять интерфейс и отображать актуальные данные.

Ниже предлагается пример того, как это можно сделать:

import 'package:flutter/material.dart';

class Dummy {
  List<Map<String, dynamic>> _countries = [
    {"country": "China", "status": true},
    {"country": "India", "status": false},
    {"country": "Russia", "status": true},
  ];

  List<Map<String, dynamic>> get countries => _countries;

  void updateStatus(int index, bool newStatus) {
    _countries[index]['status'] = newStatus;
  }
}

class MyCountries extends StatefulWidget {
  @override
  _MyCountriesState createState() => _MyCountriesState();
}

class _MyCountriesState extends State<MyCountries> {
  var test = Dummy();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DataTable with Switch Example'),
      ),
      body: SingleChildScrollView(
        scrollDirection: Axis.horizontal,
        child: DataTable(
          columns: _createColumns(),
          rows: _createRows(),
        ),
      ),
    );
  }

  List<DataColumn> _createColumns() {
    return [
      DataColumn(label: Text('Страна')),
      DataColumn(label: Text('Статус')),
    ];
  }

  List<DataRow> _createRows() {
    return List<DataRow>.generate(test.countries.length, (index) {
      var countryData = test.countries[index];
      return DataRow(cells: [
        DataCell(Text(countryData['country'])),
        DataCell(Switch(
          value: countryData['status'],
          onChanged: (bool newValue) {
            setState(() {
              test.updateStatus(index, newValue);
            });
          },
        )),
      ]);
    });
  }
}

void main() {
  runApp(MaterialApp(
    home: MyCountries(),
  ));
}

Объяснение кода:

  1. Dummy класс: Содержит список стран и их статусов (логическое значение). Метод updateStatus обновляет статус конкретной страны.

  2. MyCountries виджет: Это главный виджет, который отображает DataTable. Он реализует стейт, чтобы поддерживать обновление данных.

  3. Создание строк: В _createRows создаются строки для таблицы, где в ячейке статуса находится переключатель (Switch). При его изменении происходит вызов метода updateStatus, который обновляет состояние в Dummy.

  4. Обновление интерфейса: Используя setState, обновление переключателя приводит к перерисовке виджета с актуальными данными.

Таким образом, каждое изменение статуса в строках таблицы будет корректно отражаться на основании логики, определенной в классе Dummy, и управление состоянием останется централизованным.

Оцените материал
Добавить комментарий

Капча загружается...