在我更改复制变量的值后,StreamProvider 的值发生意外变化

Unexpected change in the value of a StreamProvider, after I change the value of a copy variable

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

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

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

代码:

@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): ===== initial provider value: 511-822-5571

I/flutter ( 7477): ===== updated provider value: NewVal

StreamProvider:

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

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

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

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