繁体   English   中英

删除 flutter 中的 textField 列表器

[英]Remove textField listner in flutter

如何禁用/删除 flutter 中的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;
  }

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

确保您使用相同实例的最简单方法是将 function 作为 state 方法。

  void _onVelocityChanged() {
    setState(() {
      totalCalculated();
    });
  }

  @override
  void initState() {
    super.initState();
    velocityEditingController.addListener(_onVelocityChanged);
    // ...
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    velocityEditingController.removeListener(_onVelocityChanged);
  }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM