【问题标题】:flutter - callback function not called while trying to call setState from child widget颤振 - 尝试从子小部件调用 setState 时未调用回调函数
【发布时间】:2022-01-11 01:18:48
【问题描述】:

我正在使用 VoidCallback 从子小部件调用 setState。但是回调函数根本没有执行。

下面是我的代码。

子小部件:

class TextFormMentorHashtag extends StatefulWidget {
  const TextFormMentorHashtag({Key? key, required this.callback}) : super(key: key);

  final VoidCallback callback;

  @override
  _TextFormMentorHashtagState createState() =>
      _TextFormMentorHashtagState();
}

class _TextFormMentorHashtagState extends State<TextFormMentorHashtag> {

  @override
  Widget build(BuildContext context) {
  ...
    TextFormField(
      ...
      onChanged: (value) {
        if(_formKey.currentState!.validate()) {
          ...
          print('call callback');
          widget.callback;
        }
      }
    )
  }
}

父小部件:

class ApplyMentorPage extends StatefulWidget {
  const ApplyMentorPage({Key? key}) : super(key: key);

  @override
  State<ApplyMentorPage> createState() => _ApplyMentorPageState();
}

class _ApplyMentorPageState extends State<ApplyMentorPage> {

  ...
  bool _disabled = true;

  @override
  Widget build(BuildContext context) {

    void callback() {
      print('callback called');
      setState(() {
        _disabled = !_mentorProvider.check();
      });
    }

    return Scaffold(
      ...
      child: Column(
        children: [
          TextFormMentorHashtag(callback: callback), 
          ...

// _disabled turns submit button on and off in the later code

当我运行代码并按下子小部件终端时会打印“调用回调”但没有“调用回调”。我错过了什么?

【问题讨论】:

  • 你应该把 widget.callback 放在下面的 onpressed try 旁边

标签: flutter callback


【解决方案1】:

您没有在您的_TextFormMentorHashtagState 中调用callback。您应该将其称为 widget.callback()widget.callback.invoke()

完整代码:

class _TextFormMentorHashtagState extends State<TextFormMentorHashtag> {

  @override
  Widget build(BuildContext context) {
  ...
    TextFormField(
      ...
      onChanged: (value) {
        if(_formKey.currentState!.validate()) {
          ...
          print('call callback');
          // or widget.callback()
          widget.callback.invoke();
        }
      }
    )
  }
}

【讨论】:

  • widget.callback() 成功了。谢谢!
【解决方案2】:

如果你使用 TextFormField 它也有 ontap

TextFormField(
  onTap: () {
    print("am called");
  }
)

所以你可能会是这样的

TextFormField(
  onTap: widget.calback
)

【讨论】:

  • 我实际上是从 TextFormField 调用它,所以我尝试了 onChanged: (value) => widget.callback,但它不起作用。我在 onChanged 内部还有其他事情(例如验证),所以我必须坚持 onChanged: (value) {widget.callback; ... }
  • 编辑了我的代码 sn-p
  • 我编辑我的,如果你使用 TextFormField 那么它有 ontap 为什么不把它放在那里。
  • 或者用 GestureDetector 包裹你的 TextFormField 并在它的 ontap 中传递 widget.callback
  • 哦,我的意思是孩子是TextFormField。每次用户输入内容时,它都会调用 widget.callback,而不仅仅是当它被点击时......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2021-11-12
  • 2020-09-22
  • 2016-03-10
  • 2019-11-29
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多