【问题标题】:How to force a function (validation) before switching tabs in flutter?如何在颤动切换标签之前强制执行功能(验证)?
【发布时间】:2021-08-27 08:54:04
【问题描述】:

布局有两个选项卡,一个用于输入,另一个用于输出,带有一个用于切换选项卡的tabBar。

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

当用户从 tabBar 点按输出选项卡进行切换时,如何强制验证? .. 这意味着除非输入有效,否则不会更改选项卡。

带有标签代码的主屏幕:

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),
   
              ]),
         ),
    );
  }
}

在输入选项卡中有一个带有输入字段的表单

@override
  SafeArea build(BuildContext context) {
    return SafeArea(
      child: Form(
        key: _formKey,
        child: Scrollbar() ....

【问题讨论】:

  • 添加相关代码以获得更好的帮助
  • TabBarView上添加NeverScrollableScrollPhysics()后,你还能滑动标签吗?
  • NeverScrollableScrollPhysics() 禁用选项卡之间的滑动,因此用户只能在 tabBar 中点击选项卡名称进行切换.. 需要的是切换(无论选项卡之间切换的方式)只有当输入是有效,以避免在输出选项卡中出现意外或不正确的结果
  • 您可以使用Rxdart 或任何将触发或观察的语句技术,一旦所有字段在第一个选项卡上有效,否则如果发现任何字段无效,则可以触发并收听TabBarView 上的那个流
  • 能否展示示例代码

标签: forms flutter dart flutter-layout flutter-test


【解决方案1】:

如果您不熟悉StreamSink,请通过Stream-Sink

pubspec.yml添加以下依赖并执行flutter pub get

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();

您可以在TabBarView 上使用,如下所示:

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);
 }
}

【讨论】:

  • 不,我没有按钮..想通过删除按钮使其更简单..只需验证用户何时尝试切换到输出选项卡
  • 您需要在填写表单时使用验证器。一旦验证失败或无效,则可以更改已在 TabBarView 之上实现的值和侦听器
猜你喜欢
  • 2021-06-10
  • 2015-01-03
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2016-09-10
  • 1970-01-01
相关资源
最近更新 更多