Forms 在颤振中切换选项卡之前,如何强制执行功能(验证)?

Forms 在颤振中切换选项卡之前,如何强制执行功能(验证)?,forms,flutter,dart,flutter-layout,flutter-test,Forms,Flutter,Dart,Flutter Layout,Flutter Test,布局有两个选项卡,一个用于输入,另一个用于输出,并带有一个选项卡栏来切换选项卡 在“输入”选项卡中有一个带有验证功能的表单,该表单应在切换到“输出”选项卡之前验证输入,因为如果输入无效,输出将显示错误 当用户点击tabBar中的output选项卡切换时,如何强制验证。。这意味着除非输入有效,否则无法更改选项卡 带有选项卡代码的主屏幕: class MainScreen extends StatefulWidget { @override _ MainScreen createState(

布局有两个选项卡,一个用于输入,另一个用于输出,并带有一个选项卡栏来切换选项卡

在“输入”选项卡中有一个带有验证功能的表单,该表单应在切换到“输出”选项卡之前验证输入,因为如果输入无效,输出将显示错误

当用户点击tabBar中的output选项卡切换时,如何强制验证。。这意味着除非输入有效,否则无法更改选项卡

带有选项卡代码的主屏幕:

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
和do
flatter 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);
 }
}