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
更多关于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
;否则,将显示相应的错误信息。
请确保在实际项目中根据需求调整代码,比如添加更多的表单字段和验证逻辑。