简体   繁体   中英

Pass fetched value to a firestore reference to flutter's streambuilder

I'm accessing a user's favorite group which is inside groupfav in Firestore, when I get it I want to give it as part of the reference to the streambuilder stream: , so that it knows what to show in a list, but I can't pass the variable that contains the favorite group, what should I do or what am I doing wrong?

static String? userID = FirebaseAuth.instance.currentUser?.uid; // get current user id
  static var taskColeccion = FirebaseFirestore.instance.collection("usuarios");
  var tack = taskColeccion.doc("$userID").get().then((value) {
    var groupfav = value.data()!["groupfav"]; // value i get from firestore
    return groupfav;
  });

  late Stream<QuerySnapshot> task = FirebaseFirestore.instance
  .collection("groups")
  .doc(groupfav) // pass the obtained value 
  .collection("tareas")
  .snapshots();

photo of firestore

The photo shows how Firestore's logic is and the value marked in green is what I must pass to the late Stream<QuerySnapshot> task... in its reference, logically it is a random value that I would not know. thanks for any help!

this is what the code looks like now (I took things that were not important)

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  static String? userID = FirebaseAuth.instance.currentUser?.uid;
  static final taskColeccion =
      FirebaseFirestore.instance.collection("usuarios");
  String groupfav = '';
  final tack = taskColeccion.doc("$userID").get().then((value) {
    groupfav = value.data()!["groupfav"];
    return groupfav;
  });

  Stream<QuerySnapshot> task = FirebaseFirestore.instance
      .collection("groups")
      .doc(groupfav) // pass the obtained value
      .collection("tareas")
      .snapshots();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Home"),
        automaticallyImplyLeading: false,
      ),
      body: StreamBuilder(
        stream: task,
        builder: (
          BuildContext context,
          AsyncSnapshot<QuerySnapshot> snapshot,
        ) {
          if (snapshot.hasError) {
            return const Text("error");
          }
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Text("cargando");
          }
          final data = snapshot.requireData;

          return ListView.builder(
            itemCount: data.size,
            itemBuilder: (context, index) {
              return Card(
                child: ListTile(
                  title: Text("${data.docs[index]['titulo']}"),
                  subtitle: Text("${data.docs[index]['contenido']}"),
                  onTap: () {},
                  trailing: IconButton(
                    icon: const Icon(Icons.delete),
                    color: Colors.red[200],
                    onPressed: () {
                      // delete function
                    },
                  ),
                ),
              );
            },
          );
        },
      ),
    );
  }
}

You just need to declare groupfav outside of the scope of the get method of taskColeccion ;

The way you have it, the variable no longer exists by the time you're trying to pass it into the task stream.

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  static String? userID = FirebaseAuth.instance.currentUser?.uid;
  static final taskColeccion =
      FirebaseFirestore.instance.collection("usuarios");

  String groupfav = '';

  late Stream<QuerySnapshot> task;

  @override
  void initState() {
    super.initState();
    taskColeccion.doc("$userID").get().then((value) {
      groupfav = value.data()!["groupfav"];
      return groupfav;
    });

    task = FirebaseFirestore.instance
        .collection("groups")
        .doc(groupfav) // pass the obtained value
        .collection("tareas")
        .snapshots();
  }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM