【问题标题】:how to set and get object value in provider ChangeNotifier flutter如何在提供者 ChangeNotifier 中设置和获取对象值
【发布时间】:2023-03-29 00:57:01
【问题描述】:

当我在提供程序类中调用此对象的一项时,我调用一个 api 并将其结果放入一个对象中,但是当我从提供程序类中调用此变量时,有时它已填充但有时为空。如何? 我这样称呼这个提供者类

 await Provider.of<StudentProfile>(context, listen: false).setProfile(
        false, username, context);

我的班级是

 class StudentProfile extends ChangeNotifier {
  StdProfile _info;
 int _val;
 setProfile(statefetch, username, context) async {
 String ip = await getServerIP();

 _info =
    await fetchProfilestudent("$ip/users/getUser/$username", context);
  print(_info.result[0].firstname);
 _val=2;

  notifyListeners();
  }

  set info(val) {
  _info = val;
  notifyListeners();
  }

 StdProfile get info => _info;
}

并调用提供者结果与

Provider.of<StudentProfile >(context).info.name;

【问题讨论】:

    标签: object flutter dart provider


    【解决方案1】:

    StudentProfile 的参数 _info 在开始时为空,当您在异步调用 setProfile 中对其进行初始化时,它会在初始化之前为空。

    Provider.of&lt;StudentProfile&gt;(context) 在 Provider 小部件下方的小部件树内绝不应为空。

    但是Provider.of&lt;StudentProfile &gt;(context).info.name会在开头为null,以防setProfile函数失败;

    为了防止它,您可以使用 ? 可空运算符: Provider.of&lt;StudentProfile &gt;(context).info?.name 将返回 null 但不会抛出错误。

    如果info?.name 为空,您还可以使用?? 运算符提供默认值 Provider.of&lt;StudentProfile &gt;(context).info?.name ?? 'Default Value';

    您可以在这篇文章https://medium.com/@thinkdigitalsoftware/null-aware-operators-in-dart-53ffb8ae80bb中了解更多关于可空运算符的信息

    【讨论】:

    • 如何先填写_info参数再使用。我首先填充它。它将被填充。我想使用 _info 的值,但不应该为 null 如何首先充满信心然后使用它
    • 如果您从服务器检索数据,您应该提供加载状态或默认值。如果您可以获得数据同步,您可以在 StudentProfile() {} init 中初始化 _info var。
    【解决方案2】:

    我觉得逻辑有点不对,但我们可以改正;如果您的目标是使用异步函数,那么使用future 或streams 将非常有用,以同样的方式指示哪种类型将返回所述函数或默认情况下不返回。

    Future<void> setProfile(statefetch, username) async {
     String ip = await getServerIP();
    
     info  = await fetchProfilestudent("$ip/users/getUser/$username", 
     context);
     ...  
    
     notifyListeners();
    }
    

    这将帮助您更好地管理数据,但这仅限于您的服务的速度,为此您可以通过使用 FutureBuilder 在您的小部件中使用它或在您的提供程序中使用 bool 属性来控制和显示来支持自己查询是结果时的 circleProgressIndicator。

    另一方面,如果您希望在解决查询后更改您的_info 属性的值,请将您的查询值等于您的 set info 函数,就像这样info = await query (),这将导致notifyListeners (); 触发通知所有侦听器的更改。

    或者你也可以尝试在构造函数中加载或初始化你的属性 但正如我之前提到的,它很大程度上受限于您的服务的响应速度

    class StudentProfile extends ChangeNotifier {`
      StdProfile _info ;
      StudentProfile(){`
      query().then((value) => this._info = value);
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 2020-04-17
      • 2019-10-14
      • 2019-12-15
      • 2022-10-24
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多