Home > Back-end >  Flutter - Firestore data assign to a variable
Flutter - Firestore data assign to a variable

Time:10-30

I need to retrieve data from firestore collection and assign exact value to String...

Here is my code.

class _AbcState extends State<Abc> {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: FirebaseFirestore.instance.collection('boat').snapshots(),
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return const Center(child: Text('Something wrong!'));
        }

        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Center(child: CircularProgressIndicator());
        }

        if (snapshot.data!.size == 0) {
          return const Center(
            child: Text('No boats'),
          );
        }

        return ListView.builder(
          padding: const EdgeInsets.all(15.0),
          physics: const ScrollPhysics(),
          shrinkWrap: true,
          itemCount: snapshot.data!.size,
          itemBuilder: (context, index) {
            Map<String, dynamic> boatData =
                snapshot.data!.docs[index].data() as Map<String, dynamic>;

            return Card(
              child: ListTile(
                contentPadding: const EdgeInsets.all(15.0),
                horizontalTitleGap: 50,
                title: Text(boatData['boatName']),
                subtitle: GetInfo(boatData: boatData),
              ),
            );
          },
        );
      },
    );
  }
}

class GetInfo extends StatelessWidget {
  const GetInfo({
    Key? key,
    required this.boatData,
  }) : super(key: key);

  final Map<String, dynamic> boatData;

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<DocumentSnapshot>(
      stream: FirebaseFirestore.instance
          .collection('actor')
          .doc(boatData['uid'])
          .snapshots(),
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return const Text('Something went wrong');
        }

        if (snapshot.connectionState == ConnectionState.waiting) {
          return const CircularProgressIndicator();
        }

        return Text(snapshot.data!['name']);
      },
    );
  }
}

By calling GetInfo I can get the data as a Text Widget.

But I need to get that value and assign it to a variable for future purposes.

I saved documents by user id in actor collection.

Please guide me to how to do that.

CodePudding user response:

one you can fix this is by having a function triggered for you in the _AbcState whenever there's a valid name in GetInfo class.

class GetInfo extends StatelessWidget {
const GetInfo({Key? key, required this.boatData, required this.uidCallback})
  : super(key: key);

  final Map<String, dynamic> boatData;
  final Function(String?) uidCallback;

  @override
  Widget build(BuildContext context) {
   return StreamBuilder<DocumentSnapshot>(
  stream: FirebaseFirestore.instance
      .collection('actor')
      .doc(boatData['uid'])
      .snapshots(),
  builder: (context, snapshot) {
    if (snapshot.hasError) {
      return const Text('Something went wrong');
    }

    if (snapshot.connectionState == ConnectionState.waiting) {
      return const CircularProgressIndicator();
     }
     final _name = snapshot.data!['name'];
     uidCallback(_name);
     return Text(_name);
    },
   );
 }
}

then on the listview you returning when there's data do this...

      return Card(
          child: ListTile(
            contentPadding: const EdgeInsets.all(15.0),
            horizontalTitleGap: 50,
            title: Text(boatData['boatName']),
            subtitle: GetInfo(
              boatData: boatData,
              uidCallback: (value) => setState(() {
                _variable = value;
              }),
            ),
          ),
        );

so with this, whenever u get a valid name, the function in your _AbcState will be triggered with the corresponding name and you can do anything with the data.

CodePudding user response:

Because you are calling DocumentSnapshot in the StreamBuidlder

Get the values like below

snapshot.data!.get('uid')
  • Related