Flutter序列化控制器插件serializable_controllers的使用

Flutter序列化控制器插件serializable_controllers的使用

serializable_controllers 是一个简单的包,旨在处理表单中的值时减少一些样板代码。

概述

通过 SerializableControllersManager 类使用 makeController 方法创建控制器,并将它们分配给表单中所需的部件。每个控制器都实现了 ValueNotifier,因此可以轻松监听更改。

您可以随时通过 SerializableControllersManagertoJson 方法获取值的序列化。

请记住在使用完毕后调用 dispose 方法来避免内存泄漏!

提供的控制器

SerializableTextEditingController

TextEditingController 提供抽象。内部的 TextEditingController 可通过对象的 controller 属性访问。

示例:

final serializableTextEditingController = manager.makeController(
      () => SerializableTextEditingController(id: 'myId'),
    );

final textEditingController = serializableTextEditingController.controller;

您可以直接监听对象来代替无聊的监听器:

ValueListenableBuilder(
    valueListenable: nameController,
    builder: (_, value, __) => Text(value ?? ''),
),

SerializableChangeController

提供了一种通过小部件的 ValueChanged 回调轻松更新值的方法。

示例:

final checkboxController = manager.makeController(
      () => SerializableChangeController(
        id: 'radio',
        initialValue: false,
      ),
    );

使用方法如下:

// 在构建方法中
ValueListenableBuilder(
    valueListenable: checkboxController,
    builder: (context, value, _) =>
        CheckboxListTile(
        value: value,
        onChanged: checkboxController.valueChanged,
        title: Text('Boolean check'),
        )
),

如您所见,您可以轻松更新UI而无需太多麻烦。

自定义控制器

您可以通过扩展 SerializableController<T> 来创建自己的控制器!

打印值

假设您已经创建了 manager

final manager = SerializableControllersManager();

只需调用:

print(jsonEncode(manager.toJson()));

查看示例以了解更多信息。

完整示例

以下是一个完整的示例,展示了如何使用 serializable_controllers 插件:

import 'dart:convert';

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

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

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

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),
    );
  }
}

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

class _HomeState extends State<Home> {
  final manager = SerializableControllersManager();
  SerializableTextEditingController nameController;
  SerializableTextEditingController surnameController;
  SerializableChangeController checkboxController;

  [@override](/user/override)
  void initState() {
    nameController = manager.makeController(
      () => SerializableTextEditingController(id: 'nome', initialValue: 'Pippo'),
    );

    surnameController = manager.makeController(
      () => SerializableTextEditingController(id: 'cognome'),
    );

    checkboxController = manager.makeController(
      () => SerializableChangeController(
        id: 'radio',
        initialValue: false,
      ),
    );
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    manager.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Serializable controllers'),
      ),
      body: Column(
        children: [
          TextFormField(
            controller: nameController.controller,
          ),
          ValueListenableBuilder(
            valueListenable: nameController,
            builder: (_, value, __) => Text(value ?? ''),
          ),
          TextFormField(
            controller: surnameController.controller,
          ),
          ValueListenableBuilder(
            valueListenable: checkboxController,
            builder: (context, value, _) => CheckboxListTile(
              value: value,
              onChanged: checkboxController.valueChanged,
              title: Text('Boolean check'),
            ),
          ),
          ElevatedButton(
            onPressed: () {
              final encoder = JsonEncoder.withIndent(' ');
              final encoded = encoder.convert(manager);
              return showDialog(
                context: context,
                builder: (_) => AlertDialog(
                  content: Text(encoded),
                ),
              );
            },
            child: Text('Submit'),
          )
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: manager.resetControllers,
        child: Icon(Icons.restore),
      ),
    );
  }
}

更多关于Flutter序列化控制器插件serializable_controllers的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter序列化控制器插件serializable_controllers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


serializable_controllers 是一个用于 Flutter 的插件,它允许你将控制器(如 TextEditingControllerScrollController 等)序列化和反序列化。这在需要保存和恢复应用状态时非常有用,例如在应用暂停或重新启动时。

以下是如何使用 serializable_controllers 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  serializable_controllers: ^1.0.0  # 请使用最新版本

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

2. 创建可序列化的控制器

serializable_controllers 提供了一些可序列化的控制器,例如 SerializableTextEditingController。你可以像使用普通控制器一样使用它们。

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

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

class _MyFormPageState extends State<MyFormPage> {
  SerializableTextEditingController _textController = SerializableTextEditingController();

  [@override](/user/override)
  void dispose() {
    _textController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Serializable Controllers Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _textController,
              decoration: InputDecoration(labelText: 'Enter some text'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 序列化控制器
                Map<String, dynamic> serialized = _textController.toJson();
                print('Serialized Controller: $serialized');

                // 反序列化控制器
                SerializableTextEditingController deserializedController = SerializableTextEditingController.fromJson(serialized);
                print('Deserialized Controller Text: ${deserializedController.text}');
              },
              child: Text('Serialize and Deserialize'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 序列化和反序列化

在上面的示例中,我们创建了一个 SerializableTextEditingController,并在按钮的 onPressed 回调中将其序列化为 JSON。然后,我们从 JSON 反序列化一个新的控制器并打印其文本。

4. 保存和恢复状态

在实际应用中,你可能会将序列化的控制器状态保存到本地存储(如 SharedPreferences)中,并在应用重新启动时恢复它。

import 'package:shared_preferences/shared_preferences.dart';

void saveControllerState(SerializableTextEditingController controller) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setString('controllerState', controller.toJson().toString());
}

Future<SerializableTextEditingController> loadControllerState() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  String? controllerState = prefs.getString('controllerState');
  if (controllerState != null) {
    return SerializableTextEditingController.fromJson(Map<String, dynamic>.from(controllerState));
  }
  return SerializableTextEditingController();
}

5. 使用保存和恢复状态

你可以在 initStatedispose 方法中调用保存和恢复状态的函数。

class _MyFormPageState extends State<MyFormPage> {
  SerializableTextEditingController _textController = SerializableTextEditingController();

  [@override](/user/override)
  void initState() {
    super.initState();
    loadControllerState().then((controller) {
      setState(() {
        _textController = controller;
      });
    });
  }

  [@override](/user/override)
  void dispose() {
    saveControllerState(_textController);
    _textController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 构建UI
  }
}
回到顶部