Как передать значение из одного класса в другой во Flutter?
Есть вот такая реализация PaginatedDataTable:
class PaginatedDataTableExample extends StatefulWidget { const PaginatedDataTableExample({super.key}); @override _PaginatedDataTableExampleState createState() => _PaginatedDataTableExampleState(); } class _PaginatedDataTableExampleState extends State<PaginatedDataTableExample> { int _rowsPerPage = PaginatedDataTable.defaultRowsPerPage; @override Widget build(BuildContext context) { return Scaffold( body: SingleChildScrollView( child: PaginatedDataTable( rowsPerPage: _rowsPerPage, onRowsPerPageChanged: (newRowsPerPage) { setState(() { _rowsPerPage = newRowsPerPage!; }); }, columns: const [ DataColumn( label: Text( "id", style: TextStyle(fontWeight: FontWeight.bold), ), ), DataColumn( label: Text( "Begin", style: TextStyle(fontWeight: FontWeight.bold), ), ), DataColumn( label: Text( "End", style: TextStyle(fontWeight: FontWeight.bold), ), ), ], source: DataTableSourceExample(), ), ), ); } } |
class PaginatedDataTableExample extends StatefulWidget { const PaginatedDataTableExample({super.key}); @override _PaginatedDataTableExampleState createState() => _PaginatedDataTableExampleState(); } class _PaginatedDataTableExampleState extends State<PaginatedDataTableExample> { int _rowsPerPage = PaginatedDataTable.defaultRowsPerPage; @override Widget build(BuildContext context) { return Scaffold( body: SingleChildScrollView( child: PaginatedDataTable( rowsPerPage: _rowsPerPage, onRowsPerPageChanged: (newRowsPerPage) { setState(() { _rowsPerPage = newRowsPerPage!; }); }, columns: const [ DataColumn( label: Text( "id", style: TextStyle(fontWeight: FontWeight.bold), ), ), DataColumn( label: Text( "Begin", style: TextStyle(fontWeight: FontWeight.bold), ), ), DataColumn( label: Text( "End", style: TextStyle(fontWeight: FontWeight.bold), ), ), ], source: DataTableSourceExample(), ), ), ); } }
И DataTableSource для него:
class DataTableSourceExample extends DataTableSource{ final List<Map<String, dynamic>> data = List.generate( 999999, (index) => { "id": index, "begin_datetime": DateTime.now(), "end_date": DateTime.now(), }, ); @override DataRow? getRow(int index) { return DataRow(cells: [ DataCell(Text(data[index]["id"].toString())), DataCell(Text(data[index]["begin_datetime"].toString())), DataCell(Text(data[index]["end_date"].toString())), ], ); } @override bool get isRowCountApproximate => false; @override int get rowCount => data.length; @override int get selectedRowCount => 0; } |
class DataTableSourceExample extends DataTableSource{ final List<Map<String, dynamic>> data = List.generate( 999999, (index) => { "id": index, "begin_datetime": DateTime.now(), "end_date": DateTime.now(), }, ); @override DataRow? getRow(int index) { return DataRow(cells: [ DataCell(Text(data[index]["id"].toString())), DataCell(Text(data[index]["begin_datetime"].toString())), DataCell(Text(data[index]["end_date"].toString())), ], ); } @override bool get isRowCountApproximate => false; @override int get rowCount => data.length; @override int get selectedRowCount => 0; }
Но в DataTableSourceExample список заранее создан (просто для теста). В дальнейшем планируется обращаться к стороннему API, в котором записей будет под миллион и больше, не хотелось бы тянуть их все сразу. Поэтому я хочу загружать из API только то количество записей, которые необходимо отобразить на странице.
Поэтому вопрос: как в DataTableSourceExample передать из PaginatedDataTableExample количество строк на странице (я так понимаю, rowsPerPage) и индекс элемента, с которого нужно загружать необходимое количество строк?
Дополнительно:
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для передачи значения из одного класса в другой во Flutter можно воспользоваться конструктором класса или использовать методы передачи данных, такие как Provider, InheritedWidget или Riverpod.
Прежде всего, рассмотрим способ передачи значения через конструктор класса. Допустим, у нас есть два класса: ClassA и ClassB. Мы хотим передать значение из ClassA в ClassB. Мы можем определить конструктор в ClassB, который принимает это значение в качестве параметра:
class ClassB { final String value; ClassB(this.value); }
Затем, в ClassA мы можем создать экземпляр ClassB и передать значение при его создании:
ClassB classB = ClassB('Значение для передачи');
Другой способ - использовать методы передачи данных, такие как Provider, InheritedWidget или Riverpod. Например, с использованием Provider, мы можем определить провайдер значения в верхнем уровне виджета и использовать Consumer для получения этого значения в любом месте приложения.
Пример использования Provider для передачи значения из ClassA в ClassB:
class ClassA extends StatelessWidget { @override Widget build(BuildContext context) { return Provider( create: (_) => 'Значение для передачи', child: ClassB(), ); } } class ClassB extends StatelessWidget { @override Widget build(BuildContext context) { String value = Provider.of(context); return Text(value); } }
Таким образом, мы рассмотрели два способа передачи значения из одного класса в другой во Flutter: через конструктор класса и с использованием методов передачи данных, таких как Provider, InheritedWidget или Riverpod. Выбор способа зависит от конкретных потребностей вашего приложения.