首页 > 解决方案 > 更改复制变量的值后,StreamProvider 的值发生意外更改

问题描述

我将 my 的值分配streamProvider给一个新的变量对象 usersList……然后我更改了tel新创建的变量中的一个属性……但是,令人惊讶的是……它Provider本身也发生了变化,我无法再访问该流的最后一个值。 ..奇怪...我认为颤振是价值而不是参考...

否则, myStreamProvider似乎正确连接到 my Firestore: 当 DB 中的值发生更改时,它会正确传播到应用程序,这是预期的行为。

帮助... 如何在不干扰提供者的情况下更改我的对象副本?

代码:

@override  Widget build(BuildContext context) {
    print("===== initial provider value: ${Provider.of<UsersList>(context).item("jaiKMOS5EHRTxc8wlorpNyLruf1").tel}");
    UsersList usersList = Provider.of<UsersList>(context); //I create a brand new variable where I assign value of Provider
    usersList.item("jaiKMOS5EHRTxc8wlorpNyLruf1").tel = "NewVal";  //I change my own local variable (not expecting Provider to change

    // ***** Why does the following value change ????
    print("===== updated provider value: ${Provider.of<UsersList>(context).item("jaiKMOS5EHRTxc8wlorpNyLruf1").tel}");
    return Text("");
}

日志:

I/flutter(7477):===== 初始提供者值:511-822-5571

I/flutter(7477):===== 更新的提供者值:NewVal

流提供者:

  @override  Widget build(BuildContext context) {
    return StreamProvider<UsersList>(
      create: (context) => _dbService.getUsersStream, initialData:null,
      child: HomePage());
  }

标签: flutterflutter-provider

解决方案


该变量只是一个占位符。您有一个对象,而变量只是将该对象存储在那里。2个变量可以指向同一个对象,这就是正在发生的事情。

当您调用 Provider 时,它只会返回对UsersList您在 Provider 构造函数 ( ) 中定义的对象 ( )的引用_dbService.getUsersStream。由于您正在使用create:,Provider将懒惰地调用该创建函数(当您第一次需要它时),然后它将在内部存储该值。create不会在您每次调用时都被调用Provider.of<UsersList>(context)

因此,您的变量usersList指向Provider内部保存的同一个对象。


推荐阅读