Flutter内置验证功能插件obsobject的使用

发布于 1周前 作者 songsunli 最后一次编辑是 5天前 来自 Flutter

Flutter内置验证功能插件obsobject的使用

obsobject 是一个用Dart编写的库,提供了可观察对象(Observable)、计算属性(Computed)和内置验证功能。它可以帮助开发者更轻松地管理状态,并在状态变化时自动通知监听器。以下是关于 obsobject 的详细说明和示例代码。

1. 安装

pubspec.yaml 文件中添加依赖:

dependencies:
  obsobject: ^1.3.0

2. Observable

Observable 是一个可以被监听的对象,当其值发生变化时,会通知所有监听器。下面是一个简单的示例:

import 'package:obsobject/obsobject.dart';

void main() {
  // 创建一个 Observable 对象,初始值为 'test'
  var a = Observable('test');

  // 添加监听器,当 a 的值发生变化时,打印当前值
  a.listen(() {
    print(a.value);
  });

  // 修改 a 的值,触发监听器
  a.value = 'First test';
}

输出结果:

test
First test

3. Computed

Computed 是一种特殊的 Observable,它的值是根据其他 Observable 对象计算得出的。Computed 会智能地识别它依赖的 Observable 对象,并在这些对象的值发生变化时自动重新计算。

import 'package:obsobject/obsobject.dart';

void main() {
  // 创建两个 Observable 对象
  var a = Observable(false);
  var b = Observable(1);

  // 创建一个 Computed 对象,计算逻辑为:如果 a 为 true,则返回 b 的值乘以 10,否则返回 0
  var c = Computed(() => a.value ? b.value * 10 : 0);

  // 打印 c 的初始值
  print(c.value); // 输出 0,因为 a 为 false

  // 修改 b 的值,但 c 的值不会变化,因为它只依赖于 a
  b.value = 2;
  print(c.value); // 输出 0

  // 修改 a 的值,c 的值会重新计算
  a.value = true;
  print(c.value); // 输出 20
}

输出结果:

0
0
20

Computed 对象只有在有监听器或访问其值时才会重新计算,并且计算过程是异步的。因此,即使 Observable 对象的值多次变化,Computed 只会在必要时进行一次计算。

import 'package:obsobject/obsobject.dart';

void main() {
  // 创建一个 Observable 对象
  var a = Observable(0);

  // 创建一个 Computed 对象,计算逻辑为返回 a 的值
  var b = Computed(() => a.value);

  // 添加监听器,当 b 的值发生变化时,打印当前值
  b.changed(() => print(b.value));

  // 快速修改 a 的值 1000 次
  for (var i = 0; i < 1000; i++) {
    a.value = i;
  }

  // 打印 b 的重建次数,应该为 1
  print(b.rebuildCount);
}

输出结果:

999
1

4. Validator

obsobject 提供了内置的验证功能,支持多种常见的验证规则,如 requiredemailrangepattern 等。每个 Observable 对象都有 validerrorvalidStatus 属性,用于表示验证状态。

import 'package:obsobject/obsobject.dart';

void main() {
  // 创建一个 Observable 对象,使用多个验证器
  var email = Observable(
    '',
    validator: ValidatorLeast([
      ValidatorRequired(),
      ValidatorEmail()
    ]),
  );

  // 打印当前的验证状态
  print(email.valid); // 输出 false,因为 email 为空
  print(email.error); // 输出 "Email is required"

  // 修改 email 的值,触发验证
  email.value = 'invalid-email';
  print(email.valid); // 输出 false,因为 email 格式不正确
  print(email.error); // 输出 "Invalid email format"

  // 修改为有效的 email
  email.value = 'test@example.com';
  print(email.valid); // 输出 true
  print(email.error); // 输出 null
}

输出结果:

false
Email is required
false
Invalid email format
true
null

5. Flutter Widget

obsobject 可以与 Flutter 结合使用,创建响应式 UI。你可以通过 StreamBuilder 或自定义的 StatefulWidget 来监听 Observable 对象的变化并更新 UI。

使用 StreamBuilder
import 'package:flutter/material.dart';
import 'package:obsobject/obsobject.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterPage(),
    );
  }
}

class CounterPage extends StatelessWidget {
  final count = Observable(0);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter')),
      body: Center(
        child: StreamBuilder<int>(
          stream: count.stream, // 使用 Observable 的 stream
          initialData: count.value,
          builder: (context, snapshot) {
            return Text('Count: ${snapshot.data}');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          count.value++; // 修改 count 的值,触发 StreamBuilder 更新
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
使用 StatefulWidget
import 'package:flutter/material.dart';
import 'package:obsobject/obsobject.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterPage(),
    );
  }
}

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

class _CounterPageState extends State<CounterPage> {
  final count = Observable(0);

  [@override](/user/override)
  void initState() {
    super.initState();

    // 监听 count 的变化,更新 UI
    count.listen((_) {
      setState(() {});
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter')),
      body: Center(
        child: Text('Count: ${count.value}'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          count.value++; // 修改 count 的值,触发监听器
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

6. 完整示例 Demo

以下是一个完整的示例,展示了如何使用 obsobject 管理用户表单的状态,并在 Flutter 中实现响应式 UI。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: UserFormPage(),
    );
  }
}

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

class _UserFormPageState extends State<UserFormPage> {
  final user = User();

  [@override](/user/override)
  void initState() {
    super.initState();

    // 监听用户表单的验证状态,更新 UI
    user.valid.listen((isValid) {
      setState(() {});
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('User Form')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              onChanged: (value) {
                user.firstName.value = value;
              },
              decoration: InputDecoration(
                labelText: 'First Name',
                errorText: user.firstName.error,
              ),
            ),
            TextField(
              onChanged: (value) {
                user.lastName.value = value;
              },
              decoration: InputDecoration(
                labelText: 'Last Name',
                errorText: user.lastName.error,
              ),
            ),
            TextField(
              onChanged: (value) {
                user.email.value = value;
              },
              decoration: InputDecoration(
                labelText: 'Email',
                errorText: user.email.error,
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: user.valid.value ? submitForm : null,
              child: Text('Submit'),
            ),
            SizedBox(height: 20),
            if (user.valid.value)
              Text('Full Name: ${user.fullName.value}', style: TextStyle(fontSize: 18)),
          ],
        ),
      ),
    );
  }

  void submitForm() {
    // 表单提交逻辑
    print('Form submitted with valid data');
  }
}

class User {
  final Observable<String> firstName = Observable(
    '',
    validator: ValidatorRequired(),
  );

  final Observable<String> lastName = Observable(
    '',
    validator: ValidatorRequired(),
  );

  final Observable<String> email = Observable(
    '',
    validator: Validator.convert({
      'least': {'required': 'Email is required', 'email': true},
    }),
  );

  late final Computed<String> fullName = Computed(() => '${firstName.value} ${lastName.value}');

  late final Computed<bool> valid = Computed(() => firstName.valid && lastName.valid && email.valid);
}

更多关于Flutter内置验证功能插件obsobject的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter内置验证功能插件obsobject的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


关于Flutter中名为obsobject的未知功能插件(请注意,由于obsobject并非一个广为人知的Flutter官方或广泛使用的第三方插件,以下回答将基于假设和一般编程原理进行探索),我们可以尝试从一些可能的方向来探讨其潜在用途。由于具体实现细节未知,我将提供一些假设性的代码案例来展示可能的用途。

假设obsobject是一个用于观察对象变化的插件

在很多编程框架中,观察对象(Observable Object)是一种常见模式,用于在对象属性变化时自动通知观察者。如果obsobject插件提供类似功能,那么它可能用于数据绑定、状态管理等场景。

示例代码:假设的obsobject使用案例

import 'package:flutter/material.dart';
// 假设obsobject插件提供了ObservableObject和observe方法
import 'package:obsobject/obsobject.dart';

// 定义一个可观察的对象类
class User extends ObservableObject {
  String name = '';
  int age = 0;

  // 设置name时自动通知观察者
  set setName(String newName) {
    name = newName;
    notifyListeners(); // 假设ObservableObject提供了notifyListeners方法
  }

  // 设置age时自动通知观察者
  set setAge(int newAge) {
    age = newAge;
    notifyListeners(); // 假设ObservableObject提供了notifyListeners方法
  }
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 创建一个User对象实例
    final user = User();

    // 观察User对象的变化
    observe(user, (changes) {
      // 当User对象的属性变化时,这里的回调会被调用
      // changes可能是一个包含变化信息的对象或列表
      print('User object changed: $changes');
    });

    // 模拟更改User对象的属性
    Future.delayed(Duration(seconds: 2), () {
      user.setName = 'Alice';
      user.setAge = 30;
    });

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Observable Object Demo'),
        ),
        body: Center(
          child: Text('Waiting for user data to update...'),
        ),
      ),
    );
  }
}

注意事项

  1. 插件文档:由于obsobject是一个假设的插件,实际使用时需要参考其官方文档了解具体API和使用方法。
  2. 错误处理:在实际代码中,应添加错误处理逻辑,以应对可能的异常情况,如观察对象被销毁后继续通知等。
  3. 性能考虑:在使用观察对象模式时,需要注意性能问题,避免不必要的重复通知和计算。

总结

虽然obsobject插件的具体实现和用途未知,但基于假设和一般编程原理,我们可以探索其可能用于观察对象变化的场景。在实际应用中,建议查阅该插件的官方文档或源代码以获取准确的信息和使用指南。

回到顶部