Forms 在颤振中切换选项卡之前,如何强制执行功能(验证)?
布局有两个选项卡,一个用于输入,另一个用于输出,并带有一个选项卡栏来切换选项卡 在“输入”选项卡中有一个带有验证功能的表单,该表单应在切换到“输出”选项卡之前验证输入,因为如果输入无效,输出将显示错误 当用户点击tabBar中的output选项卡切换时,如何强制验证。。这意味着除非输入有效,否则无法更改选项卡 带有选项卡代码的主屏幕:Forms 在颤振中切换选项卡之前,如何强制执行功能(验证)?,forms,flutter,dart,flutter-layout,flutter-test,Forms,Flutter,Dart,Flutter Layout,Flutter Test,布局有两个选项卡,一个用于输入,另一个用于输出,并带有一个选项卡栏来切换选项卡 在“输入”选项卡中有一个带有验证功能的表单,该表单应在切换到“输出”选项卡之前验证输入,因为如果输入无效,输出将显示错误 当用户点击tabBar中的output选项卡切换时,如何强制验证。。这意味着除非输入有效,否则无法更改选项卡 带有选项卡代码的主屏幕: class MainScreen extends StatefulWidget { @override _ MainScreen createState(
class MainScreen extends StatefulWidget {
@override
_ MainScreen createState() => _ MainScreen();
}
class _MainScreenState extends State< MainScreen > {
Data _data;
@override
DefaultTabController build(BuildContext context) {
return DefaultTabController(
length: 1,
child: Scaffold(
appBar: AppBar(
bottom: TabBar(tabs: [
Tab(text: 'input',
Tab(text: 'calculations']),
title: Text("screen title"),
),
body: TabBarView(
physics: NeverScrollableScrollPhysics(),
children: [
InputTab(
data: _data,
refreshDataClass: (Data dataUpdated) {_data = dataUpdated;},
),
CalculationsTab(data: _data),
]),
),
);
}
}
如果您不熟悉
流
和汇
,请通过
在pubspec.yml
和doflatter pub get
pubspec.yml:
rxdart: ^0.25.0
创建如下所示的类
//我假设您有一些按钮或单击事件,您必须在这些事件上检查表单验证,如下所示:
添加相关代码以获得更好的帮助在
TabBarView
上添加NeverScrollableScrollPhysics()
后,仍然可以滑动选项卡?NeverScrollableScrollPhysics()禁用了选项卡之间的滑动,因此用户只能点击选项卡栏中的选项卡名称进行切换。。仅当输入有效时,才需要切换(无论在选项卡之间切换的方式如何),以避免输出选项卡中出现意外或不正确的结果。您可以使用输出选项卡或任何语句技术,一旦第一个选项卡上的所有字段都有效,就会触发或观察到这些语句技术,否则,如果发现任何字段无效,则可以触发该字段,并在TabBarView
上收听该流。请显示示例代码。我没有按钮。。要通过删除按钮使其更简单。。当用户尝试切换到输出选项卡时,只需验证您在填写表单时使用的验证程序。一旦验证失败或无效,则可以更改已在TabBarView
pubspec.yml:
rxdart: ^0.25.0
class FormBloc{
StreamController<bool> _isFormStream = BehaviorSubject<bool>.seeded(false);
Stream<bool> get formStream => _isFormStream.stream;
Sink<bool> get _updateFormStream => _isFormStream.sink;
void updateFormStatus({bool isFormValid = false}){
_updateFormStream.add(isFormValid);
}
void dispose(){
_isFormStream.close();
}
}
FormBloc formBloc = FormBloc();
StreamBuilder<bool>(
stream: formBloc.formStream,
builder: (context, snapshot) {
return snapshot.hasData
? TabBarView(
physics:snapshot.data? ClampingScrollPhysics(): NeverScrollableScrollPhysics(),
children: [
InputTab(
data: _data,
refreshDataClass: (Data dataUpdated) {_data = dataUpdated;},
),
CalculationsTab(data: _data),
])
: Container(
);
})
onPressed:(){
if (_formKey.currentState!.validate()){
formBloc.updateFormStatus(isFormValid:true);
}
else {
formBloc.updateFormStatus(isFormValid:false);
}
}