我的有状态小部件不会更新 ui,即使我正在调用 setState 并将正确的值传递给小部件类

Posted

技术标签:

【中文标题】我的有状态小部件不会更新 ui,即使我正在调用 setState 并将正确的值传递给小部件类【英文标题】:My stateful widget does not update the ui, even though I am calling setState and passing the correct value to the widget class 【发布时间】:2021-11-19 13:09:56 【问题描述】:

我在颤振中遇到了一个我自己无法弄清楚的问题。

所以我有如下代码(只贴了代码的重要部分),

class _PrimaryDetailsEditState extends State<PrimaryDetailsEdit> 
  String bankName;  <---------- I have this variable inside my state class

  void _getFormData() 
    BackendApi.call(
        endpoint: APIEndPoints.GET_FORM_DATA,
        data: 'id': widget.jobId,
        onSuccess: (data) 
          setState(() 
            bankName = data['clientBank']['name'];  <-------------- I assign a new value to the above variable here
            print('Bank name is $bankName');  <-------------- This print confirms that the new value has been indeed assigned to the variable
          );
        ,
        onFailed: (error) 
          print('Failed to get data');
        );
  

  @override
  void initState() 
    _getFormData();   <------- I call the _getFormData function declared above right here.
    super.initState();
  

在上面的代码中, ???我有一个名为 bankName 的类变量,它是字符串数据类型。 ???在bankName 下定义的_getFormData 方法调用另一个名为BackendApi.call() 的静态方法,该方法负责发出http 请求以获取一些数据。 BackendApi.call() 有 4 个命名参数,其中两个重要参数是 onSuccessonFailed。这两个参数带回调函数,无论取数据成功与否,都会被调用。 ???如您所见,在onSuccess 回调中,我将从http 请求接收到的一些数据分配给bankName 变量。 ???我还在@override initState() 中调用_getFormData,以确保在挂载小部件之前发出请求。

问题

尽管bankName 保存了我想要的数据,但当该变量向下传递给小部件时,我的 UI 并未更新!

➡ 我将正确的变量传递给小部件以更新 UI。我通过注释掉_getFormData 函数并最初为bankName 分配一个值来确认这一点,例如bankName = 'Hello'。如果我这样做,UI 将更新为值Hello。所以我将正确的变量传递给小部件。

谢谢!

【问题讨论】:

你能分享你的 UI 代码,以及更新值时的任何日志,任何错误 【参考方案1】:

我认为您唯一需要做的就是将带有 onSuccess 的行更改为:

onSuccess: (data) => 

当你拥有它现在的样子时:

onSuccess: (data) 

您将 onSuccess 分配给函数的值,而不是函数本身。

【讨论】:

我试过这个....但结果还是一样......

以上是关于我的有状态小部件不会更新 ui,即使我正在调用 setState 并将正确的值传递给小部件类的主要内容,如果未能解决你的问题,请参考以下文章

在有状态小部件外部调用方法以使用颤振 Bloc 更新 UI

无法使用颤振 Bloc 模式更新小部件外部的 UI

如何更新导航抽屉中的有状态小部件,同时在 Android 中保持与片段相同的类?

Flutter/Dart:我的小部件树中可以有多个带有状态的小部件吗?

为啥即使在有状态小部件中使用 setstate 也无法获取更新的变量。因为我想在新的 TabBar 选项上更新我的 Container

即使从主线程调用更新,UI 也不会更新