我正在try 制作一款记事本应用程序.我正在通过NoteWidget在主页上显示我用StreamBuilder从Firebase中提取的数据.问题是,我想在NoteWidget中创建一个类似"data[‘note Title’]"的值,并将该值传输到备注编辑页面,这样当我单击主页上的备注名称时,我就可以转到正确的页面.

ListView(
          children: [
            StreamBuilder<QuerySnapshot>(
                stream: FirebaseFirestore.instance.collection('notes').where('user', isEqualTo: user?.uid).where('isDeleted', isEqualTo: false).snapshots(),
                builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
                  if (snapshot.hasError) {
                    return const Text('');
                  }

                  if (snapshot.connectionState == ConnectionState.waiting) {
                    return const Text('');
                  }
                  return ExpansionTile(
                    trailing: Row(
                      mainAxisSize: MainAxisSize.min,
                    ),
                    title: const Text(
                      'Notes',
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 18,
                      ),
                    ),
                    children: snapshot.data!.docs
                        .map((DocumentSnapshot document) {
                          Map<String, dynamic> data = document.data()! as Map<String, dynamic>;
                          return NoteWidget(data: data);
                        })
                        .toList()
                        .cast(),
                  );
                }),
class NoteWidget extends StatelessWidget {
  const NoteWidget({
    super.key,
    required this.data,
  });

  final Map<String, dynamic> data;
  
  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: const BoxDecoration(color: Colors.transparent),
      width: double.infinity,
      height: 50,
      child: Row(
        children: [
          const Align(
            alignment: Alignment.centerLeft,
            child: Padding(
              padding: EdgeInsets.only(
                left: 20.0,
                right: 0,
                top: 10.0,
                bottom: 10.0,
              ),
              child: Icon(
                Icons.circle,
                size: 5,
                color: Colors.white,
              ),
            ),
          ),
          Align(
            alignment: Alignment.centerLeft,
            child: Padding(
              padding: const EdgeInsets.only(
                left: 10.0,
                right: 10.0,
                top: 4.0,
                bottom: 4.0,
              ),
              child: TextButton(
                onPressed: () {
                  Navigator.of(context).pushReplacement(MaterialPageRoute(builder: ((context) => const EditNotesPage())));
                },
                child: Text(
                  data['noteTitle'],
                  style: const TextStyle(
                    color: Colors.white,
                    fontSize: 18,
                  ),
                ),
              ),
            ),
          ),
          const Expanded(
            child: SizedBox(
              height: 50,
              width: 50,
            ),
          ),
          Align(
            alignment: Alignment.centerRight,
            child: Padding(
              padding: const EdgeInsets.only(
                left: 20.0,
                right: 20.0,
                top: 10.0,
                bottom: 10.0,
              ),
              child: PopupMenuButton<int>(
                tooltip: '',
                icon: const Icon(
                  Icons.more_vert_rounded,
                  size: 24,
                  color: Colors.white,
                ),
                itemBuilder: (context) => [
                  // PopupMenuItem 1
                  PopupMenuItem(
                    value: 1,
                    // row with 2 children
                    child: Row(
                      children: const [
                        SizedBox(
                          width: 10,
                        ),
                        Text(
                          'Pin note',
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: 16,
                          ),
                        )
                      ],
                    ),
                  ),
                  // PopupMenuItem 2
                  PopupMenuItem(
                    value: 2,
                    // row with two children
                    child: Row(
                      children: const [
                        SizedBox(
                          width: 10,
                        ),
                        Text(
                          'Delete note',
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: 16,
                          ),
                        )
                      ],
                    ),
                  ),
                ],
                offset: const Offset(0, 10),
                color: const Color(0xff242424),
                elevation: 1,
                onSelected: (value) async {
                  if (value == 1) {}
                  if (value == 2) {
                    QuerySnapshot querySnap = await FirebaseFirestore.instance.collection('notes').where('docId', isEqualTo: data['docId']).get();
                    QueryDocumentSnapshot doc = querySnap.docs[0];
                    DocumentReference docRef = doc.reference;
                    return docRef.update({
                      'isDeleted': true
                    });
                  }
                },
              ),
            ),
          ),
        ],
      ),
    );
  }
}

StreamBuilder和NoteWidget以我想要的方式工作.我只是不知道如何从NoteWidget导入Firebase数据来编辑页面.我是新手,如果你能详细解释解决方案,我会很高兴的.

推荐答案

EditNotesPage类添加一个构造函数,并使用字符串类型将其命名为id. 然后像这样传递您的便条的ID:

Navigator.of(context).pushReplacement(MaterialPageRoute(builder: ((context) => const EditNotesPage(id: data['docId']))));

然后,在您的EditNotesPage类中,通过您在构造函数中传递的id来调用注释(这只是一个示例,不要复制粘贴它):

FirebaseFirestore.instance.collection('notes').where('docId', isEqualTo: widget.id) 

Flutter相关问答推荐

如何创建一个按钮来在Ffltter Webview中转到上一页?

底部导航栏项目在抖动中不更改 colored颜色

如何使用新的Riverpod语法将依赖传递给AsyncNotifier?

如何创建这样的按钮

在Flutter 中创建自定义形状

从Firestore流式传输单个文档还是整个集合更好?

即使小部件比Flutter 中的屏幕更宽,也始终显示滚动条

创建混合 TextWidget 和 TextFieldWidget

「Flutter」错误:没有名为'kind'的命名参数

Flutter中如何实现带有变化图标的浮动操作按钮?

在 Dart 中使用隔离时访问外部范围内的变量

为什么轮播加载图片很慢?

如何在 Flutter 执行通知时运行后台代码?

如何防止卡子在底部溢出?

Flutter 中父容器顶部的 Gridview 间距额外区域

如何在 ListView.builder 中扩展文本?

根据索引/变量更改小部件的 colored颜色

在自动完成中 Select 值后保持键盘焦点

Flutter_riverpod 安装时出现问题

我们什么时候在flutter中初始化一个provider?