패키지, 저장소 및 앱 카테고리 검색

dynamic_table 표지
패키지 상세v0.0.1-beta.2

dynamic_table

Flutter 프로젝트용으로 완전히 사용자 정의 가능한 데이터 테이블로, 테이블 내 값의 편집, 삭제, 추가 및 업데이트가 가능합니다.

AndroidiOSWebmacOSWindowsLinux
30일 다운로드
138
좋아요
28
Pub 점수
150

패키지 설치

flutter pub add dynamic_table

패키지 개요

공개 정보를 바탕으로 생성한 선택 가이드입니다.

Flutter용으로 매우 사용자 정의가 가능한 데이터 테이블 패키지로, 테이블 값의 실시간 편집, 삭제, 추가 및 업데이트를 가능하게 합니다. 다양한 플랫폼에서 Flutter 프로젝트에 원활하게 통합될 수 있도록 설계되었으며, 구조화된 데이터를 관리하기 위한 직관적인 인터페이스를 제공합니다. 동적 열과 행 조작을 지원하여 양식, 대시보드 및 데이터 입력 인터페이스에 적합합니다. 유연성과 사용 편의성에 중점을 두어 개발자가 많은 보일러플레이트 코드 없이도 상호작용 가능한 테이블을 만들 수 있도록 합니다.

사용 사례

  • 인터랙티브 데이터 입력 양식
  • 실시간 대시보드 데이터 관리
  • 앱 내 사용자 편집 가능한 스프레드시트
  • 다이나믹 목록 관리
  • 사용자 입력을 통한 데이터 시각화
  • 관리 패널 데이터 테이블

주요 기능

  • 편집 가능한 셀
  • 동적으로 행 추가/삭제
  • 사용자 정의 가능한 열
  • 실시간 업데이트
  • 크로스 플랫폼 지원
  • 간단한 API 통합

적합한 대상

  • 데이터 집약형 앱을 개발하는 개발자
  • 인터랙티브 테이블이 필요한 UI 디자이너
  • 사용자 주도의 데이터 수정을 요구하는 앱
  • 빠른 데이터 인터페이스 프로토타이핑
  • Android, iOS, Web, macOS, Windows 및 Linux를 대상으로 하는 프로젝트

고려 사항

  • 신중한 상태 관리가 필요합니다
  • 복잡한 레이아웃의 경우 맞춤 스타일링이 필요할 수 있습니다
  • 매우 큰 데이터 세트에서의 성능
  • 제한된 내장 검증
  • 읽기 전용 시나리오에 최적화되지 않음
  • 고급 기능을 위해 외부 종속성에 의존합니다

원본 README

연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.

Dynamic_Table

pub package

A fully customizable data table for your flutter project in which you can edit, delete, add and update values in the table.

It is build on PaginatedDataTable

Dynamic_table_gif

Getting Started

To use Dynamic_Table just add DynamicTable Widget

See Example here https://dynamic-table-example.web.app/

Table Of Content

Features

  • Add new values
  • Update values
  • Save values
  • Delete values
  • Customize style
  • Non Editable Column

Usage

Non Editable Table
DynamicTable(
  header: const Text("Person Table"),
  rowsPerPage: 5,
  showFirstLastButtons: true,
  availableRowsPerPage: const [
    5,
    10,
    15,
    20,
  ],// rowsPerPage should be in availableRowsPerPage
  columnSpacing: 60,
  showCheckboxColumn: true,
  onRowsPerPageChanged: (value) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text("Rows Per Page Changed to $value"),
      ),
    );
  },
  rows: [DynamicTableDataRow(
      index: index,
      onSelectChanged: (value) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: value ?? false
                ? Text("Row Selected index:$index")
                : Text("Row Unselected index:$index"),
          ),
        );
      },
      cells:[
        DynamicTableDataCell(value: "Name"),
        DynamicTableDataCell(value: "101"),
        DynamicTableDataCell(value: DateTime(2000, 2, 11)),
        DynamicTableDataCell(value: "Male"),
        DynamicTableDataCell(value:"Some other info about Aakash"),
      ],
    ),
  ],
  columns: [
    DynamicTableDataColumn(
        label: const Text("Name"),
        onSort: (columnIndex, ascending) {},
        dynamicTableInputType: DynamicTableTextInput()),
    // dynamicTableInputType: DynamicTableInputType.text()),
    DynamicTableDataColumn(
        label: const Text("Unique ID"),
        onSort: (columnIndex, ascending) {},
        isEditable: false,
        dynamicTableInputType: DynamicTableTextInput()),
    // dynamicTableInputType: DynamicTableInputType.text()),
    DynamicTableDataColumn(
      label: const Text("Birth Date"),
      onSort: (columnIndex, ascending) {},
      // dynamicTableInputType: DynamicTableDateInput()
      dynamicTableInputType: DynamicTableInputType.date(
        context: context,
        decoration: const InputDecoration(
            hintText: "Select Birth Date",
            suffixIcon: Icon(Icons.date_range),
            border: OutlineInputBorder()),
        initialDate: DateTime(1900),
        lastDate: DateTime.now().add(
          const Duration(days: 365),
        ),
      ),
    ),
    DynamicTableDataColumn(
      label: const Text("Gender"),
      // dynamicTableInputType: DynamicTableDropDownInput<String>()
      dynamicTableInputType: DynamicTableInputType.dropDown<String>(
        items: genderDropdown,
        selectedItemBuilder: (context) {
          return genderDropdown
              .map((e) => Text(e))
              .toList(growable: false);
        },
        decoration: const InputDecoration(
            hintText: "Select Gender", border: OutlineInputBorder()),
        displayBuilder: (value) =>
            value ??
            "", // How the string will be displayed in non editing mode
        itemBuilder: (value) {
          return DropdownMenuItem(
            value: value,
            child: Text(value),
          );
        },
      ),
    ),
    DynamicTableDataColumn(
        label: const Text("Other Info"),
        onSort: (columnIndex, ascending) {},
        dynamicTableInputType: DynamicTableInputType.text(
          decoration: const InputDecoration(
            hintText: "Enter Other Info",
            border: OutlineInputBorder(),
          ),
          maxLines: 100,
        )),
  ],
)

Editable Table

To make table editable just set showActions,showAddRowButton,showDeleteAction to true, And add onRowEdit, onRowDelete, onRowSave callbacks.

DynamicTable(
  onRowEdit: (index, row) {
    //TODO
  },
  onRowDelete: (index, row) {
    //TODO
  },
  onRowSave: (index, old, newValue) {
    //TODO
  },
  showActions: true,
  showAddRowButton: true,
  showDeleteAction: true,
);

Available CallBacks

void Function(bool?)? onSelectAll

Invoked when the user selects or unselects every row, using the checkbox in the heading row.

void Function(int)? onPageChanged

Invoked when the user switches to another page.

The value is the index of the first row on the currently displayed page.

void Function(int?)? onRowsPerPageChanged

Invoked when the user selects a different number of rows per page.

If this is null, then the value given by [rowsPerPage] will be used and no affordance will be provided to change the value.

bool Function(int, List<dynamic>)? onRowEdit

Called when the user clicks on the edit icon of a row.

Return true to allow the edit action, false to prevent it.

If the action is allowed, the row will be editable.

bool onRowEdit(int index, List<dynamic> row){
//Do some validation on row and return false if validation fails
if (index%2==1) {
  ScaffoldMessenger.of(context).showSnackBar(
   const SnackBar(
    content: Text("Cannot edit odd rows"),
  ),
);
return false; // The row will not open in editable mode
}
return true; // The row will open in editable mode
}
bool Function(int, List<dynamic>)? onRowDelete

Called when the user clicks on the delete icon of a row.

Return true to allow the delete action, false to prevent it.

If the delete action is allowed, the row will be deleted from the table.

bool onRowDelete(int index, List<dynamic> row){
//Do some validation on row and return false if validation fails
if (row[0] == null) {
   ScaffoldMessenger.of(context).showSnackBar(
    const SnackBar(
     content: Text("Name cannot be null"),
    ),
  );
 return false;
}
return true;
}
List<dynamic>? Function(int, List<dynamic>, List<dynamic>)? onRowSave

Called when the user clicks on the save icon of a row.

Return List<dynamic> newValue to allow the save action, null to prevent it.

The newValue must be a list of the same length as the column.

If the save action is allowed, the row will be saved to the table.

The oldValue is the value of the row before the edit. The newValue is the value of the row after the edit.


List<dynamic>? onRowSave(int index, List<dynamic> oldValue, List<dynamic> newValue) {
//Do some validation on new value and return null if validation fails
if (newValue[0] == null) {
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(
        content: Text("Name cannot be null"),
         ),
    );
  return null;
}
// Do some modification to `newValue` and return `newValue`
newValue[0] = newValue[0].toString().toUpperCase(); // Convert name to uppercase
// Save new data to you list
myData[index] = newValue;
return newValue;
}

Available Methods

First create a GlobalKey of DynamicTableState. Pass the key to DynmaicTable constructor.

final tableKey = GlobalKey<DynamicTableState>();
DynamicTable(key:tableKey);
addRow()
tableKey.currentState?.addRow();

Add new empty row at the 0th position in the table. The showActions parameter must be true because the row will be added in editing mode and to save the row we need actions.

NOTE: Cant add value to Non-Editable Columns.

addRowWithValues(List<dynamic> values, {bool isEditing = false})
tableKey.currentState?.addRowWithValues(`column1,column2...columnN`);

Add new row with values at the 0th position in the table.

If isEditing passed true the newly added row will be in editing mode. And if false the row will be in non editing mode.

If isEditing is true then showActions must also be true.

The values.length must be equal to columns.length.

deleteRow(int index)
tableKey.currentState?.deleteRow(0);

Delete the row at the given index.

index should be index<rows.length && index>=0.

updateRow(int index, List<dynamic> values)
tableKey.currentState.?.updateRow(0, dummyData`column1,column2,...,columnN`);

Update the column at index with the given values.

The values.length must be equal to columns.length.

index should be index<rows.length && index>=0.

insertRow(int index, List<dynamic> values, {bool isEditing = false,})
tableKey.currentState?.insertRow(
30, dummyData`column1,column2,...,columnN`
isEditing: true);

Insert new row at index with values at the in the table.

If isEditing passed true the newly added row will be in editing mode. And if false the row will be in non editing mode.

If isEditing is true then showActions must also be true.

The values.length must be equal to columns.length.

deleteAllRows()
tableKey.currentState?.deleteAllRows();

Delete all the rows from the table.

deleteSelectedRows()
tableKey.currentState?.deleteSelectedRows();

Delete only selected rows from the table.

getRowByIndex(int index)
tableKey.currentState?.getRowByIndex(10)

Get the row at index index.

The index should be index>=0 && index<rows.length.

getSelectedRows()
tableKey.currentState?.getSelectedRows()

Get all the selected rows in the table.

getAllRows()
tableKey.currentState?.getAllRows()

Get all the rows in the table.

updateAllRows(List<List<dynamic>> data)
tableKey.currentState?.updateAllRows(data);

Update all the rows inside the table with the given data.

The data.length must be equal to rows.length.

And data.length for all must be equal to columns.length.

selectRow(int index,bool isSelected)

Select or disSelect a row at 'index' based on given isSelected.

selectAllRows(bool isSeleted)

Select or disSelect all the rows in the table based on given isSelected.

Issues

Please file issues, bugs, or feature requests in issue tracker.

카테고리

소스 저장소

이 패키지를 사용하는 프로젝트

아직 데이터가 없습니다.