Как передать значение из одного класса в другой во Flutter?

Ссылка скопирована
1 ответ

Есть вот такая реализация 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) и индекс элемента, с которого нужно загружать необходимое количество строк?

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Максим Павлов Ответ

Для передачи значения из одного класса в другой во Flutter можно воспользоваться конструктором класса или использовать методы передачи данных, такие как Provider, InheritedWidget или Riverpod.

Прежде всего, рассмотрим способ передачи значения через конструктор класса. Допустим, у нас есть два класса: ClassA и ClassB. Мы хотим передать значение из ClassA в ClassB. Мы можем определить конструктор в ClassB, который принимает это значение в качестве параметра:

class ClassB {
  final String value;
 
  ClassB(this.value);
}

class ClassB { final String value; ClassB(this.value); }

Затем, в ClassA мы можем создать экземпляр ClassB и передать значение при его создании:

ClassB classB = 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);
  }
}

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. Выбор способа зависит от конкретных потребностей вашего приложения.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно