🙂 İNSANLARIN EN HAYIRLISI INSANLARA FAYDALI OLANDIR 🙂

Ramazan HABER / FLUTTER / dynamic dinamik datatable kullanımı gönderilen jsona göre columnlar oluşur

1-) FLUTTER - dynamic dinamik datatable kullanımı gönderilen jsona göre columnlar oluşur

 

KULLANIMI

 

final String _json = jsonEncode([
  {
"id": "1", "name": "Ramazan", "age": "25"},
  {
"id": "2", "name": "Ayşe", "age": "30"},
  {
"id": "3", "name": "Mehmet", "age": "35"}
]);

@override
Widget build(BuildContext context) {
  
return Scaffold(
    appBar:
AppBar(
      title:
Text('ANA ARIZA İSTEK TANIMI'),
    ),
    body:   
DynamicDataTable(
      json:
_json,
      onSelectedRowsAction: (intler) {
        print(intler);
      },
    ),
  );
}

 

 

 

KOD

 

import 'package:flutter/material.dart';
import 'dart:convert';

class DynamicDataTable extends StatefulWidget {
  
final String json;
  
final Function(Set<Map<String, dynamic>>) onSelectedRowsAction;

  DynamicDataTable({Key? key,
required this.json, required this.onSelectedRowsAction})
      :
super(key: key);

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

class _DynamicDataTableState extends State<DynamicDataTable> {
  
late List<Map<String, dynamic>> _allRows;
  
late List<Map<String, dynamic>> _filteredRows;
  
late List<String> _columns;
  Map<String, TextEditingController>
_controllers = {};
  Set<Map<String,
dynamic>> _selectedRowsData = Set<Map<String, dynamic>>();

  
@override
  
void initState() {
    
super.initState();
    
final data = jsonDecode(widget.json);
    
_allRows = List<Map<String, dynamic>>.from(data);
    
_filteredRows = _allRows;
    
if (_allRows.isNotEmpty) {
      
_columns = _allRows.first.keys.toList();
      
_controllers = {for (var column in _columns) column: TextEditingController()};
    }
  }

  
void _filterRows() {
    setState(() {
      
_filteredRows = _allRows.where((row) {
        
return _columns.every((column) {
          
final controller = _controllers[column];
          
if (controller != null && controller.text.isNotEmpty) {
            
final textLower = controller.text.toLowerCase();
            
return row[column].toString().toLowerCase().contains(textLower);
          }
          
return true;
        });
      }).toList();
    });
  }

  
@override
  
Widget build(BuildContext context) {
    
return Column(
      children: [
        
Container(
          padding:
EdgeInsets.only(top: 20, bottom: 20),
          child:
Row(
            mainAxisAlignment: MainAxisAlignment.
spaceEvenly,
            children: [
              
ElevatedButton(
                onPressed: () {
                  
widget.onSelectedRowsAction(_selectedRowsData);
                },
                child:
Text('Seçili Olanları İşle'),
              ),
            ],
          ),
        ),
        
SingleChildScrollView(
          scrollDirection: Axis.
horizontal,
          child:
DataTable(
            columnSpacing:
38.0,
            columns:
_columns.map((column) => DataColumn(
              label:
Column(
                children: [
                  
Expanded(child: Text(column)),
                  
Expanded(
                    child:
Container(
                      width:
100,
                      child:
Padding(
                        padding:
const EdgeInsets.symmetric(vertical: 4.0),
                        child:
TextField(
                          controller:
_controllers[column],
                          onChanged: (value) {
                            _filterRows();
                          },
                        ),
                      ),
                    ),
                  ),
                ],
              ),
            )).toList(),
            rows:
_filteredRows.asMap().entries.map((entry) {
              int idx = entry.
key;
              Map<String,
dynamic> row = entry.value;
              
return DataRow(
                selected:
_selectedRowsData.contains(row),
                onSelectChanged: (isSelected) {
                  setState(() {
                    
if (isSelected ?? false) {
                      
_selectedRowsData.add(row);
                    }
else {
                      
_selectedRowsData.remove(row);
                    }
                  });
                },
                cells:
_columns.map((column) {
                  
return DataCell(Text('${row[column]}'));
                }).toList(),
              );
            }).toList(),
          ),
        ),
      ],
    );
  }
}



 

 

 

 

KOD1 ÖNERİLEN KESİNLİKLE BUNU KULLAN (flutter pub add adaptive_scrollbar)

 

import 'package:adaptive_scrollbar/adaptive_scrollbar.dart';
import 'package:flutter/material.dart';
import 'dart:convert';

class DynamicDataTable extends StatefulWidget {
  
final String json;
  
final Function(Set<Map<String, dynamic>>) onSelectedRowsAction;
  
final Function(Map<String, dynamic>) onEdit;
  
final Function(Map<String, dynamic>) onDelete;
  
final List<String> hiddenColumns; // Yeni parametre: gizlenmiş sütunlar

  
DynamicDataTable({
    Key? key,
    
required this.json,
    
required this.onSelectedRowsAction,
    
required this.onEdit,
    
required this.onDelete,
    
required this.hiddenColumns, // Yeni parametre
  
}) : super(key: key);

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

class _DynamicDataTableState extends State<DynamicDataTable> {
  
late List<Map<String, dynamic>> _allRows;
  
late List<Map<String, dynamic>> _filteredRows;
  
late List<String> _columns;
  Map<String, TextEditingController>
_controllers = {};
  Set<Map<String,
dynamic>> _selectedRowsData = Set<Map<String, dynamic>>();

  
@override
  
void initState() {
    
super.initState();
    
final data = jsonDecode(widget.json);
    
_allRows = List<Map<String, dynamic>>.from(data);
    
_filteredRows = _allRows;
    
if (_allRows.isNotEmpty) {
      
_columns = _allRows.first.keys.toList();
      
_controllers = {
        
for (var column in _columns)
          column:
TextEditingController(),
      };
    }
  }

  
void _filterRows() {
    setState(() {
      
_filteredRows = _allRows.where((row) {
        
return _columns.every((column) {
          
final controller = _controllers[column];
          
if (controller != null && controller.text.isNotEmpty) {
            
final textLower = controller.text.toLowerCase();
            
return row[column].toString().toLowerCase().contains(textLower);
          }
          
return true;
        });
      }).toList();
    });
  }

  
final _horizontalScrollController = ScrollController();

  
void _handleEditRow(Map<String, dynamic> row) {
    
widget.onEdit(row);
  }

  
void _handleDeleteRow(Map<String, dynamic> row) {
    
widget.onDelete(row);
  }

  
@override
  
Widget build(BuildContext context) {
    
return ListView(
      children: [
        
Card(
          child:
Container(
            padding:
EdgeInsets.only(top: 20, bottom: 20, right: 20),
            child:
Row(
              mainAxisAlignment: MainAxisAlignment.
end,
              children: [
                
ElevatedButton.icon(
                  onPressed: () {
                    
widget.onSelectedRowsAction(_selectedRowsData);
                  },
                  icon:
Icon(
                    Icons.
verified,
                  ),
                  label:
Text('Seçili Olanları Onayla'),
                ),
              ],
            ),
          ),
        ),
        
AdaptiveScrollbar(
          controller:
_horizontalScrollController,
          position: ScrollbarPosition.
bottom,
          underColor: Colors.
blueGrey.withOpacity(0.3),
          sliderDefaultColor: Colors.
grey.withOpacity(0.7),
          sliderActiveColor: Colors.
grey,
          child:
SingleChildScrollView(
            controller:
_horizontalScrollController,
            scrollDirection: Axis.
horizontal,
            child:
Card(
              child:
DataTable(
                columnSpacing:
38.0,
                columns: [
                  ...
_columns
                      
.map(
                        (column) =>
widget.hiddenColumns.contains(column)
                        ?
DataColumn(label: SizedBox.shrink()) // Gizlenmiş sütunları görüntülememek için boş bir DataColumn ekliyoruz.
                        
: DataColumn(
                      label:
Column(
                        children: [
                          
Container(
                            margin:
EdgeInsets.only(top: 15),
                            child:
Text(column),
                          ),
                          
Expanded(
                            child:
Container(
                              width:
100,
                              child:
Padding(
                                padding:
const EdgeInsets.symmetric(vertical: 4.0),
                                child:
TextField(
                                  controller:
_controllers[column],
                                  onChanged: (value) {
                                    _filterRows();
                                  },
                                ),
                              ),
                            ),
                          ),
                        ],
                      ),
                    ),
                  )
                      .toList(),
                  
// Yeni sütun ekleyin ve her satırın altına bir düzenleme simgesi ekleyin
                  
DataColumn(
                    label:
Text('Düzenle'),
                  ),
                  
DataColumn(
                    label:
Text('Sil'),
                  ),
                ],
                rows:
_filteredRows.asMap().entries.map((entry) {
                  int idx = entry.
key;
                  Map<String,
dynamic> row = entry.value;
                  
return DataRow(
                    selected:
_selectedRowsData.contains(row),
                    onSelectChanged: (isSelected) {
                      setState(() {
                        
if (isSelected ?? false) {
                          
_selectedRowsData.add(row);
                        }
else {
                          
_selectedRowsData.remove(row);
                        }
                      });
                    },
                    cells: [
                      ...
_columns.map((column) {
                        
return widget.hiddenColumns.contains(column)
                            ?
DataCell(SizedBox.shrink()) // Gizlenmiş sütunları görüntülememek için boş bir DataCell ekliyoruz.
                            
: DataCell(Text('${row[column]}'));
                      }).toList(),
                      
// Her satırın altına bir düzenleme simgesi ekleyin
                      
DataCell(
                        
IconButton(
                          icon:
Icon(Icons.edit, color: Colors.blue),
                          onPressed: () {
                            
// Düzenleme simgesine tıklandığında ilgili satırı işlemek için bu işlevi kullanın
                            
_handleEditRow(row);
                          },
                        ),
                      ),
                      
DataCell(
                        
IconButton(
                          icon:
Icon(Icons.delete_forever, color: Colors.red),
                          onPressed: () {
                            
// Düzenleme simgesine tıklandığında ilgili satırı işlemek için bu işlevi kullanın
                            
_handleDeleteRow(row);
                          },
                        ),
                      ),
                    ],
                  );
                }).toList(),
              ),
            ),
          ),
        ),
      ],
    );
  }
}



 

 

 

 

KOD1 KULLANIMI

DynamicDataTable(
  json:
_json,
  onSelectedRowsAction: (seciliRow) {
    print(
"Seçilenleri onayla "+seciliRow.toString());
  }, onEdit: (seciliRow ) {
  print(
"Düzenle"+seciliRow.toString());

}, onDelete: (seciliRow ) {
  print(
"Sil"+seciliRow.toString());

}, hiddenColumns: [
"anaid"],


),

 

 

 2023 Kasım 03 Cuma
 229