elite_orm_editor

Version License

一组专门为 elite_orm 设计的小部件。

入门

在您的 Flutter 项目中添加依赖项

dependencies:
  ...
  elite_orm_editor:

使用示例

导入 elite_orm_editor.dart

import 'package:elite_orm_editor/elite_orm_editor.dart';

创建编辑器小部件

您的窗口小部件类将扩展 EliteORMEditor

class TeamEdit extends EliteORMEditor {
  final Team? team;
  const TeamEdit({super.key, this.team});

  @override
  State<TeamEdit> createState() => _TeamEditState();
}

创建编辑器小部件状态。

此类将处理您的编辑器小部件的大部分工作。

class _TeamEditState extends EliteORMEditorState<TeamEdit> {
  Team storage = Team();
  final List<ControlGroup> _groups = [];

  @override
  void initState() {
    super.initState();

    createDefaultControls(storage);

    // Fill in the widgets with data.
    if (widget.team != null) {
      initializeControlValues(widget.widget!);
    }
  }

  void _saveTeam() async {
    try {
      final SaveStatus status = await save(teamBloc, widget.team, storage);
      String message;
      switch (status) {
        case SaveStatus.created:
          message = "Team Saved";
          modified = false;
          break;
        case SaveStatus.updated:
          message = "Team Updated";
          modified = false;
          break;
        case SaveStatus.invalid:
          message = "Invalid Team";
          break;
      }

      // Because we're using the build context after an await, we need to
      // ensure that this widget is still mounted before using it.
      if (!modified && mounted) {
        Navigator.pop(context);
      }

      // Same here.
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text(message)),
        );
      }
    } catch (err) {
      ErrorDialog.show(context, err.toString());
    }
  }

  @override
  List<Widget> buildGroups() {
    //  Initialize your control groups here instead of in initState() in the
    // event that you use AppLocalizations.of(context) to support
    // internationalization.
    if (_groups.isEmpty) {
      _groups.add(ControlGroup(title: "Team Name", items: [controls[0]]));
      _groups.add(ControlGroup(title: "Schedule Website", items: [controls[1]]));
      _groups.add(ControlGroup(title: "Teammates", items: [controls[2]]));
    }
    return translateGroups(_groups);
  }

  @override
  String get title => "Edit Team";
}

点击 此处 查看更详细的示例。

EliteORMEditor 类

扩展 EliteORMEditor 类,而不是 StatefulWidget 类。

EliteORMEditorState 类

扩展 EliteORMEditorState 类,而不是 State 类。它将为创建单个数据库实体类型的编辑屏幕提供一个框架。

必需的方法

String get title

此抽象属性提供编辑屏幕的标题。

List<Widget> buildGroups()

此抽象方法是您向库提供信息的方式,以确保编辑控件能够正确地分组在一起。

如果您有一组列表,您的实现通常可以返回 translateGroups 的结果。

EliteORMEditorState 类可用的方法

EliteORMEditorStyle get style

默认实现提供一个 EliteORMEditorStyle 对象,其中包含有助于确定编辑屏幕外观的方法。

void createDefaultControls(Entity entity)

此方法创建一组默认控件,用于修改实体中的各个数据成员。

void initializeControlValues(Entity initial)

controls 数组中的每个控件设置为来自传入实体的值。

void addListeners(Function() listener)

controls 数组中的每个控件添加一个侦听器。

DBMemberControl? getControl(String key)

根据实体数据库成员的键从 controls 数组中获取控件。

void renderTextAdder({required String title, required bool Function(String) adder, required TextField field, String? addText, String? cancelText})

此方法创建一个带有单个文本字段输入的模态底部工作表。它用于将文本项添加到列表中。

List<Widget> translateGroup(ControlGroup group)

将单个 ControlGroup 转换为一组小部件,用于构成编辑屏幕的一部分。

List<Widget> translateGroups(List<ControlGroup> groups)

将一组组转换为小部件列表。在实现 buildGroups() 时使用此方法。

Future<void> renderListChooser({ required DBMemberControl control, required String title, required List items, Function? toString, Function? toSubtitle, }) async

Future<bool> onWillPop() async

在子类中覆盖此方法。它将允许您提示用户保存他们的更改,如果他们还没有这样做的话。

Widget renderContent()

默认实现创建一个 ListView,其中包含 buildGroups() 的结果。

bool isValid(Entity entity)

默认实现会查看主键的所有部分,这些部分是 String 类型,并检查是否有任何部分为空。如果有一个或多个为空,则返回 false。否则,返回 true。

bool hasPrimaryChanged(Entity? original, Entity entity)

对主键的每个部分进行比较。如果有任何部分发生更改,则返回 true。

Future<SaveStatus> save(Bloc bloc, Entity? original, Entity entity) async

此方法将根据 entity 创建或更新数据库条目(如果被认为是有效的),并返回状态。

Row? renderBottomIcons()

在子类中覆盖此方法,并返回一个包含小部件列表的 Row,以显示底部导航栏。

默认实现返回 null。

Widget? renderBottomNavigationBar()

如果 renderBottomIcons() 不返回 null,则此方法会创建一个 BottomAppBar

PreferredSizeWidget renderAppBar()

默认实现返回一个带有文本标题的 AppBar 小部件。

Widget build(BuildContext context)

默认实现使用一个简单的 Scaffold,该 Scaffold 由 WillPopScope 包裹。如果此实现不适合您的需求,请在子类中覆盖它。

EliteORMList 类

扩展 EliteORMList 类,而不是 StatefulWidget 类。

EliteORMListState 类

扩展 EliteORMListState 类,而不是 State 类。它将为创建表示数据库中每个实体的 Card 小部件列表提供一个框架。

必需的方法

Bloc get bloc

提供数据库实体的 bloc。

String get title

此抽象属性提供列表屏幕的标题。

Widget getEditor([Entity? entity])

返回一个将在单个卡片被点击时创建“编辑”屏幕的小部件。

String getEntityTitle(Entity entity)

返回将用作卡片标题的字符串。

EliteORMListState 类可用的方法

String get loading

返回一个字符串以向用户指示数据正在加载。

String? getEntitySubtitle(Entity entity)

如果需要,请覆盖此方法以返回卡片副标题。

EliteORMEditorStyle get style

默认实现提供一个 EliteORMEditorStyle 对象,其中包含有助于确定列表屏幕外观的方法。

int sorter(Entity a, Entity b)

实现一个用于 List.sort() 的排序器,用于两个数据库实体。它使用 getEntityTitle 从两个实体中提取标题,并根据这些标题进行排序。

Widget renderEntity(Entity entity)

渲染一个小部件以显示数据库实体的信息。

Widget renderEntities(AsyncSnapshot<List<Entity>> snapshot)

渲染实体列表或“加载中”的圆形进度指示器。

Row? renderBottomIcons()

在子类中覆盖此方法,并返回一个包含小部件列表的 Row,以显示底部导航栏。

默认实现返回一个带有单个“加号”图标的 Row,用于创建新的数据库实体对象。

Widget? renderBottomNavigationBar()

如果 renderBottomIcons() 不返回 null,则此方法会创建一个 BottomAppBar

PreferredSizeWidget renderAppBar()

默认实现返回一个带有文本标题的 AppBar 小部件。

Widget build(BuildContext context)

默认实现使用一个简单的 Scaffold。如果此实现不适合您的需求,请在子类中覆盖它。

GitHub

查看 Github