Flutter狗狗信息管理插件dogs_core的使用

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

Flutter狗狗信息管理插件 dogs_core 的使用

dogs_core 是一个用于 Dart 对象图(Dart Object Graphs,简称 DOGs)的库,它通过代码生成来创建可序列化的类结构定义,并且这些定义可以在运行时使用。该插件支持多种格式的序列化和反序列化,并提供了丰富的功能如数据类、构建器、投影、多态性、验证等。

主要特性

  • 简洁:编写表达性强的代码,几乎没有样板代码。
  • 快速:性能与现有替代方案相当或更高。
  • 可扩展:可以修改和自定义任何部分的序列化逻辑。
  • 适应性强:支持多种格式,也可以带入自己的格式。
  • 文档齐全:详细的文档和示例。
  • 优秀的开发体验:无需部分文件、美元符号、getter 方法等麻烦。

支持的格式

  • JSON(包含在 dogs_core 中)
  • YAML(通过 dogs_yaml 包)
  • TOML(通过 dogs_toml 包)
  • CBOR(通过 dogs_cbor 包)

核心包功能

JSON 支持

核心包自带 JSON 支持,无需额外依赖。

构建器

提供自动生成的构建器,类似于 built_value,允许轻松创建不可变对象并具有流畅的 API。

数据类

使用 Dataclass 混入自动实现 toStringequalshashCode,无需引入类似 equatable 的包或编写大量样板代码。

投影

提供强大的投影 API,可以将对象转换为其他对象,而无需编写额外的样板代码。

多态性

支持多态序列化,允许序列化和反序列化不同类型的对象,甚至可以使用接口和抽象类作为类型。

验证

使用验证 API 可以轻松验证对象,无需为大多数常见用例编写自己的验证逻辑。

OpenAPI Schema(预览)

提供模式生成 API,可以为对象生成 OpenAPI 模式,以便与 Swagger 等工具一起使用。

示例代码

以下是一个简单的示例,展示如何使用 dogs_core 来定义和序列化一个 Person 类:

import 'package:dogs_core/dogs.dart';

[@serializable](/user/serializable)
class Person with Dataclass<Person> {
  @LengthRange(max: 128)
  final String name;

  @Minimum(18)
  final int age;

  @SizeRange(max: 16)
  @Regex("((_)?[a-z]+[A-Za-z0-9]*)+")
  final Set<String>? tags;

  Person(this.name, this.age, this.tags);
}

void main() {
  // 创建一个新的 Person 实例
  var person = Person('John Doe', 30, {'developer', 'engineer'});

  // 序列化为 JSON
  var json = serialize(person);

  print(json); // 输出: {"name":"John Doe","age":30,"tags":["developer","engineer"]}

  // 反序列化为 Person 实例
  var deserializedPerson = deserialize<Person>(json);

  print(deserializedPerson.name); // 输出: John Doe
}

Firestore 集成

dogs_core 还提供了对 Firebase Firestore 的支持,可以通过简单的扩展方法或实体 API 轻松地将可序列化的对象存储到 Firestore 或从中读取。

安装

pubspec.yaml 文件中添加以下依赖项:

dependencies:
  dogs_core: ^latest_version
  dogs_firestore: ^latest_version

使用

import 'package:dogs_core/dogs.dart';
import 'package:dogs_firestore/dogs_firestore.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

[@serializable](/user/serializable)
class Dog with Dataclass<Dog> {
  final String name;
  final int age;

  Dog(this.name, this.age);
}

void main() async {
  FirebaseFirestore firestore = FirebaseFirestore.instance;

  // 创建一个新的 Dog 实例
  var dog = Dog('Buddy', 5);

  // 将 Dog 实例保存到 Firestore
  await saveToFirestore(dog, firestore.collection('dogs').doc());

  // 从 Firestore 读取 Dog 实例
  var docSnapshot = await firestore.collection('dogs').doc().get();
  var retrievedDog = await readFromFirestore<Dog>(docSnapshot);

  print(retrievedDog.name); // 输出: Buddy
}

表单集成

dogs_forms 包可以帮助你轻松创建表单,无需编写样板代码。该包使用 flutter_form_builder 作为底层实现,因此你可以利用其丰富的表单字段生态系统。

安装

pubspec.yaml 文件中添加以下依赖项:

dependencies:
  dogs_forms: ^latest_version

使用

import 'package:flutter/material.dart';
import 'package:dogs_forms/dogs_forms.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';

[@serializable](/user/serializable)
class User with Dataclass<User> {
  final String name;
  final int age;

  User(this.name, this.age);
}

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('User Form')),
        body: FormBuilder(
          child: UserForm(),
        ),
      ),
    );
  }
}

class UserForm extends StatefulWidget {
  [@override](/user/override)
  _UserFormState createState() => _UserFormState();
}

class _UserFormState extends State<UserForm> {
  final _formKey = GlobalKey<FormBuilderState>();

  void _submitForm() {
    if (_formKey.currentState?.saveAndValidate() ?? false) {
      var user = User(
        _formKey.currentState!.value['name'],
        int.parse(_formKey.currentState!.value['age']),
      );

      print(user.name); // 输出: 输入的名字
      print(user.age);  // 输出: 输入的年龄
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        FormBuilderTextField(
          name: 'name',
          decoration: InputDecoration(labelText: 'Name'),
        ),
        FormBuilderTextField(
          name: 'age',
          decoration: InputDecoration(labelText: 'Age'),
          keyboardType: TextInputType.number,
        ),
        ElevatedButton(
          onPressed: _submitForm,
          child: Text('Submit'),
        ),
      ],
    );
  }
}

更多关于Flutter狗狗信息管理插件dogs_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter狗狗信息管理插件dogs_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用dogs_core插件(假设这是一个提供狗狗信息管理功能的插件)的代码示例。由于dogs_core并非一个真实存在的插件,以下代码将基于一个假设的API和功能进行编写。实际使用时,请根据dogs_core插件的官方文档进行调整。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加dogs_core插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  dogs_core: ^x.y.z  # 替换为实际版本号

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

2. 导入插件

在你的Dart文件中导入dogs_core插件:

import 'package:dogs_core/dogs_core.dart';

3. 初始化插件

通常,插件需要初始化。假设dogs_core有一个初始化方法:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await DogsCore.initialize();  // 假设这是初始化方法
  runApp(MyApp());
}

4. 使用插件功能

假设dogs_core提供了添加、获取和删除狗狗信息的功能,以下是如何使用这些功能的示例:

添加狗狗信息

void addDog(String name, int age, String breed) async {
  Dog dog = Dog(name: name, age: age, breed: breed);
  try {
    await DogsCore.addDog(dog);
    print('Dog added successfully');
  } catch (e) {
    print('Failed to add dog: $e');
  }
}

获取狗狗信息列表

void fetchDogs() async {
  try {
    List<Dog> dogs = await DogsCore.getDogs();
    dogs.forEach((dog) => print('Dog: ${dog.name}, Age: ${dog.age}, Breed: ${dog.breed}'));
  } catch (e) {
    print('Failed to fetch dogs: $e');
  }
}

删除狗狗信息

void deleteDog(String name) async {
  try {
    bool success = await DogsCore.deleteDog(name);
    if (success) {
      print('Dog deleted successfully');
    } else {
      print('Dog not found');
    }
  } catch (e) {
    print('Failed to delete dog: $e');
  }
}

5. 在UI中使用

假设你有一个简单的UI来展示这些功能:

import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await DogsCore.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dog Information Manager',
      home: DogInfoScreen(),
    );
  }
}

class DogInfoScreen extends StatefulWidget {
  @override
  _DogInfoScreenState createState() => _DogInfoScreenState();
}

class _DogInfoScreenState extends State<DogInfoScreen> {
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _ageController = TextEditingController();
  final TextEditingController _breedController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dog Information Manager'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _nameController,
              decoration: InputDecoration(labelText: 'Name'),
            ),
            TextField(
              controller: _ageController,
              decoration: InputDecoration(labelText: 'Age'),
              keyboardType: TextInputType.number,
            ),
            TextField(
              controller: _breedController,
              decoration: InputDecoration(labelText: 'Breed'),
            ),
            ElevatedButton(
              onPressed: () async {
                String name = _nameController.text;
                int age = int.tryParse(_ageController.text) ?? 0;
                String breed = _breedController.text;
                addDog(name, age, breed);
                _nameController.clear();
                _ageController.clear();
                _breedController.clear();
              },
              child: Text('Add Dog'),
            ),
            ElevatedButton(
              onPressed: fetchDogs,
              child: Text('Fetch Dogs'),
            ),
            ElevatedButton(
              onPressed: () async {
                String name = _nameController.text;
                _nameController.clear();
                deleteDog(name);
              },
              child: Text('Delete Dog'),
            ),
          ],
        ),
      ),
    );
  }
}

请注意,上述代码中的DogsCore类及其方法(如initializeaddDoggetDogsdeleteDog)以及Dog类都是假设的。实际使用时,你需要参考dogs_core插件的官方文档来了解其API和使用方法。

回到顶部