在我更改复制变量的值后,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
内部保存的同一个对象。
我将 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
内部保存的同一个对象。