【问题标题】:Remove textField listner in flutter在颤动中删除 textField 侦听器
【发布时间】:2021-05-11 02:24:17
【问题描述】:

如何在颤动中禁用/删除textField 的控制侦听器,我正在使用 3 个textField 连接一个简单的数学.. (textField1 + textField2 = textField3) & ( textField1 - textField3 = textField2)... 我需要更改 textField3 的值并保持 textField2 的值不变?目前的情况是这样的 这是我的代码

@override
  void initState() {
    super.initState();
    _focus.addListener(() {
      if (_focus.hasFocus) {
        _finalValue.clear();
      }
    });
    _focuselocity.addListener(() {
      if (_focuselocity.hasFocus) {
        velocityEditingController.clear();
      }
    });
    textEditingController.addListener(() => setState(() {}));
    velocityEditingController.addListener(() => setState(() {
          totalCalculated();
        }));
    _finalValue.addListener(() => setState(() {
          totalCalculated();
        }));
  }

  @override
  void dispose() {
    super.dispose();
    velocityEditingController.removeListener(() {
      totalCalculated();
    });
    textEditingController.removeListener(() {
      totalCalculated();
    });
    _finalValue.removeListener(() {
      totalCalculated();
    });
  }

  String totalCalculated() {
    airFlowText = textEditingController.text;
    velocityText = velocityEditingController.text;
    finalText = _finalValue.text;

    if (airFlowText != '' && velocityText != '' && !_focus.hasFocus) {
      sam = (int.parse(airFlowText) + int.parse(velocityText)).toString();
      lastVelocityValue = velocityText;
      _finalValue.value = _finalValue.value.copyWith(
        text: sam.toString(),
      );
    }
    if (airFlowText != '' && finalText != null && !_focuselocity.hasFocus) {
      sam = (int.parse(airFlowText) - int.parse(finalText)).toString();
      velocityEditingController.value =
          velocityEditingController.value.copyWith(
        text: sam.toString(),
      );
    }
    return sam;
  }

【问题讨论】:

    标签: android flutter listener textfield


    【解决方案1】:

    为了删除监听器,您必须提供该函数的确切实例。在您的代码中,您每次都在创建新函数,因此 Dart 并没有真正看到它们是“相等的”。

    确保您使用相同实例的最简单方法是将您的函数作为状态方法。

      void _onVelocityChanged() {
        setState(() {
          totalCalculated();
        });
      }
    
      @override
      void initState() {
        super.initState();
        velocityEditingController.addListener(_onVelocityChanged);
        // ...
      }
    
      @override
      void didChangeDependencies() {
        super.didChangeDependencies();
        velocityEditingController.removeListener(_onVelocityChanged);
      }
    

    还请注意,您应该在 TextEditingControllers 上调用 dispose,而不是删除 dispose 上的侦听器,这会有效地删除侦听器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 2018-09-04
      相关资源
      最近更新 更多