Firebase 如何在颤振中更改StreamBuilder中特定切换开关的状态

Firebase 如何在颤振中更改StreamBuilder中特定切换开关的状态,firebase,flutter,google-cloud-firestore,state,toggleswitch,Firebase,Flutter,Google Cloud Firestore,State,Toggleswitch,我正在使用Flatter构建一个学校服务跟踪应用程序。因为我是移动应用开发的新手,所以我面临着很多错误。其中之一是, 用户登录应用程序后,在仪表板中,它将在卡片小部件中显示其子女的个人资料。每个配置文件作为切换开关按钮更新其出勤情况 只要他们点击开关按钮,数据库中的数据就会更新。但不知道如何改变点击切换开关按钮的状态 我正在使用Google Firebase Firestore数据库 CustomScrollView( slivers: <Widget&g

我正在使用Flatter构建一个学校服务跟踪应用程序。因为我是移动应用开发的新手,所以我面临着很多错误。其中之一是,

用户登录应用程序后,在仪表板中,它将在卡片小部件中显示其子女的个人资料。每个配置文件作为切换开关按钮更新其出勤情况

只要他们点击开关按钮,数据库中的数据就会更新。但不知道如何改变点击切换开关按钮的状态

我正在使用Google Firebase Firestore数据库

       CustomScrollView(
          slivers: <Widget>[
            SliverList(
              delegate: SliverChildListDelegate([
                whiteLogo(), // this is a logo widget
              ]),
            ),
            StreamBuilder(
              stream: Firestore.instance.collection('profiles').snapshots(),
              builder: (context, snapshot) => SliverList(
                  delegate: SliverChildBuilderDelegate((context, index) =>
                    Container(
                      child: userCard(context, snapshot.data.documents[index]), // profile card
                    ),
                  childCount: snapshot.hasData ? snapshot.data.documents.length : 0,
                ),
              )
            )
          ],
        )
这是我的数据库结构

配置文件(子项)表结构

以下是考勤表的结构。每个文档将以特定日期的名称每天创建一次。在每个文档配置文件中,ID存储为子集合

在每个配置文件子集合中,文档将在配置文件名称下包含考勤详细信息

这就是我从数据库检索数据的方式

       CustomScrollView(
          slivers: <Widget>[
            SliverList(
              delegate: SliverChildListDelegate([
                whiteLogo(), // this is a logo widget
              ]),
            ),
            StreamBuilder(
              stream: Firestore.instance.collection('profiles').snapshots(),
              builder: (context, snapshot) => SliverList(
                  delegate: SliverChildBuilderDelegate((context, index) =>
                    Container(
                      child: userCard(context, snapshot.data.documents[index]), // profile card
                    ),
                  childCount: snapshot.hasData ? snapshot.data.documents.length : 0,
                ),
              )
            )
          ],
        )

在当前实现中,开关状态不反映数据库的值,因为没有更新其值的数据订阅。您可以将
UserCard
小部件设为无状态,只需使用
StreamBuilder
从考勤收集中读取
开关的值即可

类似这样的操作可以实现这一目的,您的考勤开关将根据考勤文档设置其状态(如果尚未创建文档,则应将其设置为
false

列(
儿童:[
正文(
“缺席/出席”,
样式:TextStyle(
颜色:颜色(0xff868686),
字体大小:12.0
),
),
StreamBuilder(
流:attendanceReference.snapshots(),
initialData:null,
建造商:(ctx,snap){
返回开关(
值:snap.data==null?false:snap.data[“考勤状态”],
一旦更改:(值){
Firestore.instance.runTransaction((事务)异步{
DocumentSnapshot freshSnap=等待事务.get(attendanceReference);
等待事务处理。更新(freshSnap.reference{
“出席情况”:值
});
});
},
);
},
)

感谢您的快速响应。出现了一个错误弹出窗口。
引发了另一个异常:“DocumentSnapshot”类型不是“bool”类型的子类型。
Ya,很抱歉在值分配中出现了错误。请尝试查看分配
开关
值的行现在是否工作得更好。您就是那个人。它工作得很好。一个小的e出现了错误。在我将检索方法更改为这种方式后,它工作了。
snap.data[“考勤状态”]
很高兴听到这个消息!我更新了答案以反映:-)
  initState() {
    status = true;
    super.initState();
  }