firebase 如何用子集合firestore中的数据制作动画树视图

mspsb9vt  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(77)

这是我的treeview页面脚手架代码示例。我用动画树视图类

import 'package:animated_tree_view/animated_tree_view.dart';
    
// Widget build
    return Scaffold(
            key: _scaffoldKey,
            appBar: AppBar(
              title: Text(widget.title),
            ),
            body: CustomScrollView(
              controller: scrollController,
              slivers: [
                SliverToBoxAdapter(
                  child: Padding(
                      padding: const EdgeInsets.only(
                          top: 12.0, left: 12, right: 30, bottom: 12),
                      child: Align(
                        alignment: Alignment.topLeft,
                        child: SizedBox(
                          width: 200,
                          height: 40,
                          child: ElevatedButton(
                            child: const Text("Add main activity"),
                            style: ElevatedButton.styleFrom(
                                backgroundColor: Theme.of(context).primaryColor,
                                textStyle: const TextStyle(color: Colors.white),
                                shape: RoundedRectangleBorder(
                                    borderRadius: BorderRadius.circular(5))),
                            onPressed: () {
                              // simpleTree.add(TreeNode());
                              Navigator.of(context)
                                  .push(MaterialPageRoute(
                                      builder: (context) => const ActivityAdd(
                                          title: 'Add Activity', selfId: 'root')))
                                  .then((val) => {
                                        debugPrint(val),
                                        val ? _getRequests() : null
                                      });
                            },
                          ),
                        ),
                      )),
                ),
                SliverTreeView.simple(
                  tree: simpleTree,
                  expansionBehavior: ExpansionBehavior.collapseOthers,
                  showRootNode: false,
                  key: _simpleTreeKey,
                  scrollController: scrollController,
                  builder: (context, node) => Card(
                      child: node.isRoot
                          ? buildRootItem(node)
                          : buildListItem(node)),
                ),
              ],
            ));
      }

字符串
如果你有任何经验的动画树视图与firebase数据。最后,我想自动更新时,用户添加一个新的树节点到数据库。我找到了一些方法来显示树视图,但它不是真实的的工作。请帮帮我

klsxnrf1

klsxnrf11#

我自己解决了问题

最终代码如下
活动_model.dart

TreeNode simpleTree = TreeNode.root();
  Future<TreeNode> getTree() async {
    simpleTree = TreeNode.root();
    final snapshot =
        await FirebaseFirestore.instance.collection(C_ACTIVITIES).get();
    snapshot.docs.map((doc) => {_buildNode(doc)}).toList();
    return simpleTree;
  }

  Future<void> _buildNode(DocumentSnapshot doc) async {
    simpleTree.add(TreeNode(key: doc.id.toString(), data: doc.data()!));
    _buildChildNode(doc, doc.id.toString());
  }

  Future<void> _buildChildNode(DocumentSnapshot doc, String pathtext) async {
    final childrenRef = await doc.reference.collection('activity_child').get();
    pathtext += "." + doc.id.toString();
    if (childrenRef.docs.isNotEmpty) {
      childrenRef.docs
          .map((doc) => {
                simpleTree
                    .elementAt(pathtext)
                    .add(TreeNode(key: doc.id.toString(), data: doc.data())),
                _buildChildNode(doc, pathtext),
              })
          .toList();
    }
  }

字符串
活动_page.dart

final Future<TreeNode> futureTree = Future<TreeNode>.delayed(
    const Duration(milliseconds: 1000),
    () => ActivityModel().getTree(),
  );

Scaffold(
        key: _scaffoldKey,
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: FutureBuilder<TreeNode>(
            future: futureTree,
            builder: (BuildContext context, AsyncSnapshot<TreeNode> snapshot) {
              if (snapshot.hasData) {
                return CustomScrollView(
                  controller: scrollController,
                  slivers: [
                    SliverToBoxAdapter(
                      child: Padding(
                          padding: const EdgeInsets.only(
                              top: 12.0, left: 12, right: 30, bottom: 12),
                          child: Align(
                            alignment: Alignment.topLeft,
                            child: SizedBox(
                              width: 200,
                              height: 40,
                              child: ElevatedButton(
                                child: const Text("Add main activity"),
                                style: ElevatedButton.styleFrom(
                                    backgroundColor:
                                        Theme.of(context).primaryColor,
                                    textStyle:
                                        const TextStyle(color: Colors.white),
                                    shape: RoundedRectangleBorder(
                                        borderRadius:
                                            BorderRadius.circular(5))),
                                onPressed: () {
                                  // simpleTree.add(TreeNode());
                                  Navigator.of(context)
                                      .push(MaterialPageRoute(
                                          builder: (context) =>
                                              const ActivityAdd(
                                                  title: 'Add Activity',
                                                  selfId: 'root')))
                                      .then((val) => {
                                            val == 'success'
                                                ? _getRequests()
                                                : null
                                          });
                                },
                              ),
                            ),
                          )),
                    ),
                    SliverTreeView.simple(
                        tree: simpleTree,
                        expansionBehavior: ExpansionBehavior.collapseOthers,
                        showRootNode: false,
                        key: _simpleTreeKey,
                        onItemTap: (value) => {},
                        scrollController: scrollController,
                        onTreeReady: (controller) => {debugPrint("Loaded")},
                        builder: (context, node) {
                          return node.isRoot
                              ? buildRootItem(node)
                              : buildListItem(node);
                        }),
                  ],
                );
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return Center(
                  child: SizedBox(
                    width: 60,
                    height: 60,
                    child: CircularProgressIndicator(),
                  ),
                );
              }
            }));
  }
}


它现在运行得很好。

相关问题