Flutter模型编辑器插件model_editors的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter模型编辑器插件 model_editors 的使用

model_editors 是一个用于复杂模型和列表的控制器与编辑器的Flutter插件。它受到TextEditingController简单性的启发,封装了状态管理,使您不必手动调用setState(){}

功能介绍

控制器

  • AbstractListEditingController:这是一个ValueNotifier<List<T?>>,负责添加、删除和重新排序列表项。
  • CheckboxGroupEditingController:这是一个ValueNotifier<List<T>>,用于根据用户操作存储多个值。

小部件

  • ColumnListEditor:显示单个编辑器并允许删除它们。
  • ReorderableListViewEditor:除了允许删除外,还支持重新排序。
  • MaterialCheckboxColumn:以列的形式显示复选框组。

示例代码

以下是一个完整的示例演示如何使用model_editors来创建一个书籍编辑器:

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

enum BookFormat {
  hard,
  paper,
}

class Book {
  final String title;
  final String author;
  final List<BookFormat> formats;

  Book({
    required this.title,
    required this.author,
    required this.formats,
  });
}

class BookEditingController extends ValueNotifier<Book?> {
  final titleController = TextEditingController();
  final authorController = TextEditingController();
  final formatsController = CheckboxGroupEditingController<BookFormat>();

  BookEditingController() : super(null);

  @override
  set value(Book? book) {
    if (book == null) {
      titleController.text = '';
      authorController.text = '';
      formatsController.value = [];
    } else {
      titleController.text = book.title;
      authorController.text = book.author;
      formatsController.value = book.formats;
    }
    notifyListeners();
  }

  @override
  Book? get value {
    final title = titleController.text.trim();
    final author = authorController.text.trim();

    if (title == '' || author == '') return null;

    return Book(
      title: title,
      author: author,
      formats: formatsController.value,
    );
  }

  @override
  void dispose() {
    Future.delayed(const Duration(seconds: 2), _disposeNow);
    super.dispose();
  }

  void _disposeNow() {
    titleController.dispose();
    authorController.dispose();
    formatsController.dispose();
  }
}

class BookListEditingController extends ListEditingController<Book, BookEditingController> {
  BookListEditingController()
      : super(
          minLength: 1,
          maxLength: 3,
          createItemController: BookEditingController.new,
        );
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "model_editors Example",
      home: MyHomePage(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _listController = BookListEditingController();

  @override
  void initState() {
    super.initState();
    _listController.value = [
      Book(
        title: "Speak, Memory",
        author: "Vladimir Nabokov",
        formats: [BookFormat.hard],
      ),
      Book(
        title: "The Power of Now",
        author: "Eckhart Tolle",
        formats: [BookFormat.paper],
      ),
    ];
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Container(
          padding: const EdgeInsets.all(20),
          child: Column(
            children: [
              ReorderableListEditor<Book, BookEditingController>(
                controller: _listController,
                itemBuilder: (context, itemController, index) =>
                    BookEditor(controller: itemController),
                shrinkWrap: true,
                spacing: 20,
              ),
              CollectionAddButtonBuilder(
                controller: _listController,
                enabledBuilder: (context) {
                  return IconButton(
                    icon: const Icon(Icons.add),
                    onPressed: () => _listController.add(null),
                  );
                },
              ),
              ElevatedButton(
                child: const Text("Save"),
                onPressed: _onSavePressed,
              ),
            ],
          ),
        ),
      ),
    );
  }

  void _onSavePressed() {
    final items = _listController.nonNullValues;
    print("Got ${items.length} non-empty books.");
  }

  @override
  void dispose() {
    _listController.dispose();
    super.dispose();
  }
}

class BookEditor extends StatelessWidget {
  final BookEditingController controller;

  BookEditor({
    required this.controller,
  });

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        TextField(
          decoration: const InputDecoration(labelText: "Title"),
          controller: controller.titleController,
        ),
        TextField(
          decoration: const InputDecoration(labelText: "Author"),
          controller: controller.authorController,
        ),
        MaterialCheckboxColumn<BookFormat>(
          controller: controller.formatsController,
          allValues: BookFormat.values,
          labels: const {
            BookFormat.hard: "Hard Cover",
            BookFormat.paper: "Paperback",
          },
        ),
      ],
    );
  }
}

总结

通过上述示例,您可以轻松地在Flutter应用中集成复杂的模型编辑功能。此插件提供了灵活且强大的工具,帮助开发者简化状态管理和UI构建。希望这个示例能帮助您快速上手并应用到您的项目中。


更多关于Flutter模型编辑器插件model_editors的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模型编辑器插件model_editors的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,作为一个IT专家,我可以为你提供一个关于如何在Flutter项目中使用model_editors插件的示例代码。假设model_editors是一个提供3D模型编辑功能的Flutter插件(请注意,由于Flutter生态系统庞大且不断变化,具体的插件名称和功能可能会有所不同;以下代码是一个假设性的示例)。

首先,你需要确保已经在pubspec.yaml文件中添加了model_editors依赖:

dependencies:
  flutter:
    sdk: flutter
  model_editors: ^latest_version  # 替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们来看一个如何在Flutter应用中使用这个插件的示例。假设model_editors插件提供了一个ModelEditor小部件,允许用户在界面上编辑3D模型。

import 'package:flutter/material.dart';
import 'package:model_editors/model_editors.dart'; // 假设插件提供了这个导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Model Editor Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ModelEditorScreen(),
    );
  }
}

class ModelEditorScreen extends StatefulWidget {
  @override
  _ModelEditorScreenState createState() => _ModelEditorScreenState();
}

class _ModelEditorScreenState extends State<ModelEditorScreen> {
  // 假设这是从服务器或本地资源加载的初始3D模型数据
  final String initialModelData = 'path/to/your/3d/model.glb'; // 替换为实际的模型路径或数据

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('3D Model Editor'),
      ),
      body: Center(
        child: ModelEditor(
          initialModel: initialModelData, // 加载初始模型
          onModelChanged: (newModelData) {
            // 当模型被编辑后,这里会收到新的模型数据
            // 你可以在这里保存模型数据到服务器或本地存储
            print('Model has been updated: $newModelData');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 这里可以添加额外的功能,比如重置模型或导出模型
        },
        tooltip: 'Action',
        child: Icon(Icons.add),
      ),
    );
  }
}

// 假设ModelEditor是插件提供的小部件,具有以下构造函数参数:
// - initialModel: 初始的3D模型数据(路径或字符串形式的数据)。
// - onModelChanged: 当模型数据改变时的回调函数,接收新的模型数据。
class ModelEditor extends StatefulWidget {
  final String initialModel;
  final ValueChanged<String> onModelChanged;

  ModelEditor({required this.initialModel, required this.onModelChanged});

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

// 注意:这里的_ModelEditorState类只是示意性的,实际实现取决于插件的内部逻辑。
class _ModelEditorState extends State<ModelEditor> {
  // 插件内部逻辑将在这里处理3D模型的加载、渲染和编辑。
  @override
  Widget build(BuildContext context) {
    // 这里应该是插件提供的实际UI组件,用于渲染和编辑3D模型。
    return Container(
      // 假设这是插件提供的用于渲染3D模型的容器组件。
      child: Text('3D Model Editor UI goes here'), // 替换为实际的3D模型编辑器UI。
    );
  }
}

注意

  1. 上面的代码是一个假设性的示例,因为model_editors这个插件名称并不是Flutter官方或广泛认知的插件。实际的插件可能有不同的API和用法。
  2. 你需要查阅model_editors插件的官方文档来了解其确切的用法和API。
  3. 如果model_editors插件不存在或没有提供类似的功能,你可能需要寻找其他支持3D模型编辑的Flutter插件或库,或者考虑使用原生平台(如Android或iOS)的库并通过Flutter的平台通道与之交互。
回到顶部