flutter - 更改复制变量的值后,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());
}
解决方案
该变量只是一个占位符。您有一个对象,而变量只是将该对象存储在那里。2个变量可以指向同一个对象,这就是正在发生的事情。
当您调用 Provider 时,它只会返回对UsersList
您在 Provider 构造函数 ( ) 中定义的对象 ( )的引用_dbService.getUsersStream
。由于您正在使用create:
,Provider
将懒惰地调用该创建函数(当您第一次需要它时),然后它将在内部存储该值。create
不会在您每次调用时都被调用Provider.of<UsersList>(context)
。
因此,您的变量usersList
指向Provider
内部保存的同一个对象。
推荐阅读
- reactjs - 反应阿波罗形式
- javascript - 如何使用 Rails + Webpack 配置 Bootstrap 插件?
- java - OpenShift:在 java 运行时更改 ConfigMap
- javascript - 用于填充剩余空间的响应式容器的 CSS
- html - HTML:将单独的音频附加到视频不起作用
- python-3.x - rasa ImportError:无法导入名称'InvalidSignatureError
- java - 无法在 GAE 上部署没有 app.yml 文件的 Java WAR 应用程序
- java - Oracle DB、客户端查询工具设计
- r - 将列移动到第三列位置
- python - 如何使用 plt.addplots 创建多个 3D 图