Flutter插件gg_value的特性与使用

Flutter插件gg_value的特性与使用

GgValue 是一个用于 Dart 的简单值表示方式。它不仅表示内存中的值,还提供了诸如高效的观察、字符串转换等功能。

Flutter插件gg_value特性

  • GgValue 提供了一个 stream,可以获取值的更新。
  • 具有防垃圾邮件机制,防止多次连续更新。
  • 可以设置自定义的 transform 函数来保持值在所需的范围内。
  • 可以设置自定义的 isOk 函数来防止错误的值被赋值。
  • 可以设置自定义的 compare 函数,确保只有当值变化时才会发送更新。
  • 可以设置自定义的 stringify 函数来将值转换为字符串。
  • 可以设置自定义的 parse 函数来将字符串转换为值。
  • 提供了 syncWithunsync 函数来同步多个值。

使用示例

import 'dart:convert';

import 'package:gg_value/gg_value.dart';

void main() async {
  // 创建一个等待一小段时间的方法
  Future<void> flush() => Future.delayed(const Duration(microseconds: 1));

  // 同步设置值
  var v = GgValue<int>(seed: 5, spam: false);
  print('Sync: ${v.value}'); // 输出: Sync: 5

  // 当 spam 设置为 false 时,stream 只会传递最后的更改
  v.spam = false;
  v.stream.listen((val) => print('Async: $val'));
  v.value = 1;
  v.value = 2;
  v.value = 3;
  await flush(); // 输出: Async: 3

  // 当 spam 设置为 true 时,stream 会传递每次更改
  v.spam = true;
  v.value = 7;
  v.value = 8;
  v.value = 9;
  await flush(); // 输出: Async: 7, Async: 8, Async: 9

  // 转换分配的值
  int ensureMaxFive(int v) => v > 5 ? 5 : v;
  var v2 = GgValue<int>(seed: 0, transform: ensureMaxFive);
  v2.value = 4;
  print('Transformed: ${v2.value}'); // 输出: Transformed: 4
  v2.value = 10;
  print('Transformed: ${v2.value}'); // 输出: Transformed: 5

  // 验证输入值是否有效
  bool allowOnlyEven(int val) => val % 2 == 0;
  var evenOnly = GgValue<int>(seed: 0, isOk: allowOnlyEven);

  evenOnly.value = 4;
  print('isOk: ${evenOnly.value}'); // 输出: isOk: 4

  evenOnly.value = 5;
  print('isOk: ${evenOnly.value}'); // 输出: isOk: 4

  // 只在值发生变化时才传递更新
  bool haveSameFirstLetters(String a, String b) =>
      a.substring(0, 1) == b.substring(0, 1);

  var v3 = GgValue<String>(
    seed: 'Karl',
    compare: haveSameFirstLetters,
    spam: true,
  );

  final receivedUpdates = [];
  v3.stream.listen((val) => receivedUpdates.add(val));

  v3.value = 'Anna';
  v3.value = 'Arno';
  v3.value = 'Berta';
  v3.value = 'Bernd';
  await flush();

  print(receivedUpdates.join(', ')); // 输出: Anna, Berta

  // 设置和获取字符串值
  var v4 = GgValue(seed: 0);
  v4.stringValue = '4';
  print(v4.value); // 输出: 4
  print(v4.stringValue); // 输出: 4

  // 指定自定义解析和字符串转换函数
  int parseEm(String em) => int.parse(em.replaceAll('em', ''));
  String toEmString(int val) => '${val}em';
  var v5 = GgValue(seed: 0, parse: parseEm, stringify: toEmString);
  v5.stringValue = '5em';
  print(v5.value); // 输出: 5
  print(v5.stringValue); // 输出: 5em

  // 使用 jsonDecodedValue 获取或分配可以写入 JSON 的值表示形式
  final val6 = GgValue(seed: 6);
  final object = jsonDecode('{"a": 7}');
  val6.jsonDecodedValue = object['a'];
  print(val6.value); // 输出: 7

  // 最后调用 dispose 关闭所有流并确保不再发出未完成的更新
  final val7 = GgValue(seed: 6, spam: false);
  val7.stream.listen((value) => print(value));
  val7.value++;
  val7.dispose();
  await flush(); // 输出: 无输出,因为值已被处置

  // 使用 syncWith 和 unsync 同步多个值
  final valA = GgValue(seed: 'A');
  final valB = GgValue(seed: 'B');
  final valC = GgValue(seed: 'C');

  valA.syncWith(valB);
  print(valA.value); // 输出: A
  print(valB.value); // 输出: A
  valB.syncWith(valC);
  print(valC.value); // 输出: A

  valB.value = 'B';
  print(valA.value); // 输出: B
  print(valB.value); // 输出: B
  print(valC.value); // 输出: B

  valC.unsync();
  valC.value = 'C';
  print(valA.value); // 输出: B
  print(valB.value); // 输出: B
  print(valC.value); // 输出: C

  // 处理列表及其更改
  final listValue = GgListValue(seed: [0, 1, 2, 3]);
  late GgChange<List<int>> lastChange;
  listValue.changeStream.listen((event) => lastChange = event);

  listValue.add(4);
  await flush();
  print('type: ${lastChange.type}'); // 输出: type: GgChangeType.insert
  print('index: ${lastChange.index}'); // 输出: index: 4
  print('oldValue: ${lastChange.oldValue}'); // 输出: oldValue: [0, 1, 2, 3]
  print('newValue: ${lastChange.newValue}'); // 输出: newValue: [0, 1, 2, 3, 4]

  listValue.remove(4);
  await flush();
  print('type: ${lastChange.type}'); // 输出: type: GgChangeType.remove
  print('index: ${lastChange.index}'); // 输出: index: 4
  print('oldValue: ${lastChange.oldValue}'); // 输出: oldValue: [0, 1, 2, 3, 4]
  print('newValue: ${lastChange.newValue}'); // 输出: newValue: [0, 1, 2, 3]

  listValue.insertAfter(3, 4);
  await flush();
  print('type: ${lastChange.type}'); // 输出: type: GgChangeType.insert
  print('index: ${lastChange.index}'); // 输出: index: 4
  print('oldValue: ${lastChange.oldValue}'); // 输出: oldValue: [0, 1, 2, 3]
  print('newValue: ${lastChange.newValue}'); // 输出: newValue: [0, 1, 2, 3, 4]

  listValue.insertBefore(0, -1);
  await flush();
  print('type: ${lastChange.type}'); // 输出: type: GgChangeType.insert
  print('index: ${lastChange.index}'); // 输出: index: 4
  print('oldValue: ${lastChange.oldValue}'); // 输出: oldValue: [0, 1, 2, 3, 4]
  print('newValue: ${lastChange.newValue}'); // 输出: newValue: [-1, 0, 1, 2, 3, 4]

  listValue.removeAt(0);
  await flush();
  print('type: ${lastChange.type}'); // 输出: type: GgChangeType.remove
  print('index: ${lastChange.index}'); // 输出: index: 4
  print('oldValue: ${lastChange.oldValue}'); // 输出: oldValue: [-1, 0, 1, 2, 3, 4]
  print('newValue: ${lastChange.newValue}'); // 输出: newValue: [0, 1, 2, 3, 4]

  listValue.move(fromIndex: 0, toIndex: 5);
  await flush();
  print('type: ${lastChange.type}'); // 输出: type: GgChangeType.move
  print('index: ${lastChange.index}'); // 输出: index: 4
  print('oldIndex: ${lastChange.oldIndex}'); // 输出: oldValue: [0, 1, 2, 3, 4]
  print('oldValue: ${lastChange.oldValue}'); // 输出: newValue: [1, 2, 3, 4, 0]
}

更多关于Flutter插件gg_value的特性与使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件gg_value的特性与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何在Flutter项目中集成和使用一个假设的第三方插件 gg_value 的代码示例。请注意,由于 gg_value 并非一个真实存在的插件(根据我的知识库),我将模拟一个类似的插件使用过程,并假设它提供了一些基本功能,比如获取和设置值。

首先,你需要确保你的Flutter项目中已经添加了该插件的依赖。由于这是一个假设的插件,我将模拟一个 pubspec.yaml 文件的依赖添加过程:

dependencies:
  flutter:
    sdk: flutter
  gg_value: ^1.0.0  # 假设的版本号

然后,运行 flutter pub get 来获取依赖。

接下来,我将展示如何在你的Flutter应用中导入并使用这个假设的 gg_value 插件。

main.dart

import 'package:flutter/material.dart';
import 'package:gg_value/gg_value.dart';  // 假设的插件导入

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  GgValue? _ggValuePlugin;
  String? _value;

  @override
  void initState() {
    super.initState();
    // 初始化插件
    _ggValuePlugin = GgValue();

    // 假设插件有一个方法叫 getValue,用于获取当前的值
    _ggValuePlugin!.getValue().then((value) {
      setState(() {
        _value = value;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('gg_value Plugin Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Current Value:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              _value ?? 'Loading...',
              style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 假设插件有一个方法叫 setValue,用于设置新的值
                _ggValuePlugin!.setValue('New Value from Flutter').then((_) {
                  // 更新UI
                  _ggValuePlugin!.getValue().then((newValue) {
                    setState(() {
                      _value = newValue;
                    });
                  });
                });
              },
              child: Text('Set New Value'),
            ),
          ],
        ),
      ),
    );
  }
}

假设的 gg_value 插件代码(仅用于说明)

由于我们不能创建真实的第三方插件代码,这里是一个简化的模拟代码,展示插件可能的结构:

// 假设的 gg_value.dart 文件
import 'dart:async';

class GgValue {
  String? _currentValue = 'Initial Value';

  Future<String> getValue() async {
    // 模拟异步操作,比如从本地存储或网络获取值
    await Future.delayed(Duration(seconds: 1));
    return _currentValue!;
  }

  Future<void> setValue(String newValue) async {
    // 模拟异步操作,比如保存到本地存储或网络
    await Future.delayed(Duration(seconds: 1));
    _currentValue = newValue;
  }
}

请注意,上面的 gg_value.dart 文件仅用于展示插件可能的结构,并不是一个真实的第三方插件实现。在实际使用中,你会从pub.dev或其他来源获取真实的插件,并按照其文档进行集成和使用。

希望这能帮助你理解如何在Flutter项目中集成和使用一个假设的第三方插件!如果你有一个具体的、真实存在的插件需要集成,请提供更多详细信息,以便给出更准确的指导。

回到顶部