Flutter表单管理插件stx_form_bloc的使用

Flutter 表单管理插件 stx_form_bloc 的使用

通过使用 BLoC 模式来轻松管理表单状态。stx_form_bloc 插件可以帮助我们将表单的状态和业务逻辑从用户界面中分离出来。

示例代码

// ignore_for_file: unnecessary_overrides

import 'package:bloc/bloc.dart';
import 'package:stx_form_bloc/stx_form_bloc.dart';

class SimpleBlocObserver extends BlocObserver {
  [@override](/user/override)
  void onCreate(BlocBase bloc) {
    super.onCreate(bloc);
    // 打印创建时的信息
  }

  [@override](/user/override)
  void onEvent(Bloc bloc, Object? event) {
    super.onEvent(bloc, event);
    // 打印事件触发时的信息
  }

  [@override](/user/override)
  void onChange(BlocBase bloc, Change change) {
    super.onChange(bloc, change);
    // 打印状态改变时的信息
  }

  [@override](/user/override)
  void onError(BlocBase bloc, Object error, StackTrace stackTrace) {
    super.onError(bloc, error, stackTrace);
    // 打印错误发生时的信息
  }

  [@override](/user/override)
  void onClose(BlocBase bloc) {
    super.onClose(bloc);
    // 打印关闭时的信息
  }
}

class LoginFormBloc extends FormBloc<String, String> {
  late TextFieldBloc email;
  late TextFieldBloc password;
  late List<TextFieldBloc> additionalFields;

  LoginFormBloc({
    String? emailData,
  }) {
    email = TextFieldBloc(
      initialValue: emailData ?? 'volodymyr@gmail.com',
      // 自定义验证器
      customValidators: {FieldBlocValidators.email},
      rules: {ValidationType.onChange},
    );

    password = TextFieldBloc(
      initialValue: 'qwerty123',
      // 自定义验证器
      customValidators: {FieldBlocValidators.passwordMin6Chars},
      rules: {ValidationType.onChange},
    );

    additionalFields = List.generate(
      100000,
      (index) {
        return TextFieldBloc(
          initialValue: 'qwerty123',
          // 自定义验证器
          customValidators: {FieldBlocValidators.passwordMin6Chars},
          rules: {ValidationType.onChange},
        );
      },
    );

    addFields([
      email,
      password,
      ...additionalFields,
    ]);
  }

  [@override](/user/override)
  void onSubmit() {
    emitSuccess('Ok');
  }
}

void main() {
  Bloc.observer = SimpleBlocObserver();
  formMain();
}

void formMain() async {
  final stopwatch = Stopwatch()..start();

  final formBloc = LoginFormBloc(emailData: 'sdcwcdscvd@dsvv.rvevr');

  print('执行耗时 ${stopwatch.elapsedMilliseconds}毫秒');

  stopwatch
    ..reset()
    ..start();

  print(formBloc.email.extraData);

  print('改变值');
  formBloc.password.changeValue('qwerty12345');

  print('重置值');
  formBloc.password.reset();

  print('清除值');
  formBloc.password.clear();

  print('提交表单');
  formBloc.submit();

  await formBloc.close();

  print('执行耗时 ${stopwatch.elapsedMilliseconds}毫秒');
}

更多关于Flutter表单管理插件stx_form_bloc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用stx_form_bloc插件来管理表单的示例代码。这个插件通常用于状态管理,使得表单验证和状态处理变得更加简单和高效。

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

dependencies:
  flutter:
    sdk: flutter
  stx_form_bloc: ^最新版本号  # 请替换为实际最新版本号

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

以下是一个简单的示例,展示了如何使用stx_form_bloc来管理一个包含用户名和密码的登录表单:

1. 创建FormBloc和FormEvent

首先,我们需要定义一个FormBloc来处理表单的状态和事件。

import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:stx_form_bloc/stx_form_bloc.dart';

part 'login_form_event.dart';
part 'login_form_state.dart';

class LoginFormBloc extends FormBloc<LoginFormEvent, LoginFormState> {
  LoginFormBloc() : super(LoginFormState.initial());

  @override
  Stream<FormBlocState<LoginFormState>> onEvent(
    LoginFormEvent event,
    Emitter<FormBlocState<LoginFormState>> emit,
  ) async* {
    // Handle form submission
    if (event is LoginFormSubmitted) {
      final isValid = validate();
      if (isValid) {
        emit(state.copyWith(status: FormStatus.submissionSuccess));
      } else {
        emit(state.copyWith(status: FormStatus.submissionInValid));
      }
    }

    // You can add more event handlers here if needed
  }

  @override
  List<FormFieldValidator> get validators {
    return [
      (formState) {
        if (formState.fields['username']?.isEmpty ?? true) {
          return {'username': 'Username is required'};
        }
        return {};
      },
      (formState) {
        if (formState.fields['password']?.isEmpty ?? true) {
          return {'password': 'Password is required'};
        }
        return {};
      },
    ];
  }
}

2. 定义FormEvent和FormState

接下来,我们定义表单的事件和状态。

login_form_event.dart

part of 'login_form_bloc.dart';

abstract class LoginFormEvent extends FormEvent {}

class LoginFormSubmitted extends LoginFormEvent {}

login_form_state.dart

part of 'login_form_bloc.dart';

class LoginFormState extends FormState {
  const LoginFormState({
    Map<String, dynamic> fields = const {},
    FormStatus status = FormStatus.initial,
    List<String> globalErrors = const [],
  }) : super(fields: fields, status: status, globalErrors: globalErrors);

  factory LoginFormState.initial() {
    return LoginFormState(
      fields: {
        'username': '',
        'password': '',
      },
    );
  }

  LoginFormState copyWith({
    Map<String, dynamic> fields,
    FormStatus status,
    List<String> globalErrors,
  }) {
    return LoginFormState(
      fields: fields ?? this.fields,
      status: status ?? this.status,
      globalErrors: globalErrors ?? this.globalErrors,
    );
  }
}

3. 使用FormBlocBuilder构建UI

最后,我们在UI中使用FormBlocBuilder来构建表单。

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:stx_form_bloc/stx_form_bloc.dart';
import 'login_form_bloc.dart';

class LoginScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (_) => LoginFormBloc(),
      child: Scaffold(
        appBar: AppBar(title: Text('Login')),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: FormBlocBuilder<LoginFormBloc, LoginFormState>(
            builder: (context, state) {
              return Column(
                children: <Widget>[
                  TextFormField(
                    decoration: InputDecoration(labelText: 'Username'),
                    onChanged: (value) =>
                        context.read<LoginFormBloc>().change(username: value),
                    validator: (value) {
                      final errors = state.errors['username'];
                      return errors?.first;
                    },
                  ),
                  TextFormField(
                    decoration: InputDecoration(labelText: 'Password'),
                    obscureText: true,
                    onChanged: (value) =>
                        context.read<LoginFormBloc>().change(password: value),
                    validator: (value) {
                      final errors = state.errors['password'];
                      return errors?.first;
                    },
                  ),
                  SizedBox(height: 20),
                  ElevatedButton(
                    onPressed: () {
                      context.read<LoginFormBloc>().add(LoginFormSubmitted());
                    },
                    child: Text('Login'),
                  ),
                  if (state.status == FormStatus.submissionInValid)
                    Text('Please correct the errors in the form.'),
                  if (state.status == FormStatus.submissionSuccess)
                    Text('Login successful!'),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的登录表单,使用stx_form_bloc来管理表单的状态和验证。当用户提交表单时,如果表单数据有效,状态将更新为submissionSuccess;否则,将显示相应的错误信息。

请确保在实际项目中根据需求调整代码,比如添加更多的表单字段和验证逻辑。

回到顶部