Flutter输入验证插件acceptable的使用

Flutter输入验证插件acceptable的使用

acceptable 是一个用于 Flutter 的包,它提供了 AcceptableStatefulWidget,可以将 Provider 包中的 ProviderStatefulWidget 结合起来。本文将展示如何使用 acceptable 插件来实现一个简单的计数器应用。

特性

  • 监视由 Provider 提供的状态对象的变化。
  • 当监视的对象发生变化时,可以通过回调将其转换为用于 UI 的状态。

开始使用

由于此包完全依赖于 provider 包,因此你必须首先导入最新版本的 provider

你需要通过 Provider 或其他相关类向后代提供任意状态对象。

然后,构建一个使用 AcceptableStatefulWidgetStatefulWidget,而不是直接使用 StatefulWidget,该 StatefulWidget 使用由这些对象提供的数据来表示任意 UI。

AcceptableStatefulWidget 可以接受该状态对象并检测其变化,并调用 apply 函数将其转换为用于 UI 的状态。

使用示例

假设我们要实现一个计数器应用,其中计数器的值由 CounterState 管理,该 CounterState 扩展了 ValueNotifier。我们可以实现一个 MultipleCounter,该 MultipleCounter 构建一个 Text 组件来显示计数器值的两倍。

class MultipleCounter extends AcceptableStatefulWidget {
  const MultipleCounter({Key? key}) : super(key: key);

  [@override](/user/override)
  _MultipleCounterState createState() => _MultipleCounterState();
}

class _MultipleCounterState extends AcceptableStatefulWidgetState<MultipleCounter> {

  [@override](/user/override)
  void acceptProviders(Accept accept) {
    accept<CounterState, int>(
      watch: (state) => state.value,  // 监视 state.value 的变化
      apply: (value) => _value = value * 2,  // 将 value 值加倍并赋给 _value
      perform: (value) {
        // 在重建完成后执行的操作,例如 showDialog
      }
    );
  }

  late int _value;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text('$_value');  // 显示 _value 的值
  }
}

关键方法

watch

watch 方法返回要监视的对象。在上面的例子中,MultipleCounter 监视 state.value 的变化,其中 stateCounterState 的实例。

此方法类似于 provider 包中的 context.select<Value, T>() 方法。

apply

apply 方法表示如何将提供的数据(通过调用 watch 决定)应用于 UI 的状态。

在上面的例子中,value 被加倍并分配给 _value 字段,然后在 build 方法中使用。

因为 apply 在观察的值发生变化时在 build 调用之前被调用,所以你不需要在 build 方法中转换提供的值。

perform

perform 方法在重建完成后被调用。在这里可以调用一些命令式的方法,如 showDialogNavigator.push 等。

动机

通过使用 AcceptableStatefulWidget,你不必:

  • 创建代表特定 UI 的状态对象(通常称为 ViewModel)。

你可以:

  • State 类中管理 UI 的状态,这完全遵循 Flutter 的基本理念。
  • 集中精力通过 Provider 提供数据,而不必考虑它们在每个 UI 中的具体使用方式。

完整示例代码

以下是完整的示例代码,展示了如何使用 acceptable 插件来实现一个计数器应用。

import 'package:example/append_unit_counter.dart';
import 'package:example/multiple_counter.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

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

class CounterState extends ValueNotifier<int> {
  CounterState(int value) : super(value);

  void add() => value += 1;
  void clear() => value = 0;
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ChangeNotifierProvider(
        child: MyHomePage(title: 'Flutter Demo Home Page'),
        create: (context) => CounterState(0),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({
    Key? key,
    required this.title,
  }) : super(key: key);

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            const SizedBox(height: 32),
            Row(
              children: [
                const Expanded(child: MultipleCounter()),
                const Expanded(child: AppendUnitCounter()),
              ],
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: context.read<CounterState>().add,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter输入验证插件acceptable的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,我可以为你提供一个关于如何在Flutter项目中使用acceptable插件来进行输入验证的代码示例。acceptable是一个用于表单验证的Flutter插件,它提供了一系列方便的验证器来处理用户输入。

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

dependencies:
  flutter:
    sdk: flutter
  acceptable: ^x.y.z  # 请将x.y.z替换为最新版本号

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

以下是一个使用acceptable插件进行输入验证的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Input Validation with Acceptable',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Input Validation Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: ValidationForm(),
        ),
      ),
    );
  }
}

class ValidationForm extends StatefulWidget {
  @override
  _ValidationFormState createState() => _ValidationFormState();
}

class _ValidationFormState extends State<ValidationForm> {
  final _formKey = GlobalKey<FormState>();
  String _email = '';
  String _password = '';

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          TextFormField(
            decoration: InputDecoration(labelText: 'Email'),
            validator: (value) {
              if (value.isEmpty) {
                return 'Email is required';
              }
              // 使用acceptable插件的验证器
              final emailValidator = EmailValidator();
              if (!emailValidator.isValid(value)) {
                return 'Invalid email address';
              }
              return null;
            },
            onChanged: (value) {
              setState(() {
                _email = value;
              });
            },
          ),
          TextFormField(
            decoration: InputDecoration(labelText: 'Password'),
            obscureText: true,
            validator: (value) {
              if (value.isEmpty) {
                return 'Password is required';
              }
              // 使用acceptable插件的验证器,这里假设密码长度至少为6
              if (value.length < 6) {
                return 'Password must be at least 6 characters long';
              }
              return null;
            },
            onChanged: (value) {
              setState(() {
                _password = value;
              });
            },
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              if (_formKey.currentState!.validate()) {
                // 验证通过后执行的操作
                print('Email: $_email');
                print('Password: $_password');
              }
            },
            child: Text('Submit'),
          ),
        ],
      ),
    );
  }
}

注意:

  1. 在这个示例中,虽然acceptable插件提供了很多内置的验证器,但Flutter的TextFormField自带的validator属性已经足够处理简单的验证逻辑。如果你需要更复杂的验证逻辑,acceptable插件可以非常有用。
  2. 为了简单起见,这里并没有直接使用acceptable插件提供的所有高级功能,而是展示了如何结合Flutter内置的验证机制和acceptable插件(假设的EmailValidator)进行验证。
  3. acceptable插件通常提供更多的验证器,比如长度验证器、正则表达式验证器等,你可以根据具体需求查阅其文档来使用这些验证器。

由于acceptable插件的具体实现和API可能会有所变化,建议查阅最新的官方文档以获取最准确的信息和示例。

回到顶部