程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了添加数据时不会实时显示 Firebase 列表视图大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决添加数据时不会实时显示 Firebase 列表视图?

开发过程中遇到添加数据时不会实时显示 Firebase 列表视图的问题如何解决?下面主要结合日常开发的经验,给出你关于添加数据时不会实时显示 Firebase 列表视图的解决方法建议,希望对你解决添加数据时不会实时显示 Firebase 列表视图有所启发或帮助;

从电话中选择联系人后,我将联系人信息存储在 Firebase 实时数据库中。 当我添加使用 ListVIEw 和 DataSnapshot 显示的数据时,数据不会实时刷新,直到我重新启动 Activity。 ListVIEw 加载并显示所有数据没有任何问题。我该如何解决这个问题?

我的屏幕如下所示:

添加数据时不会实时显示 Firebase 列表视图

屏幕代码:

import 'package:epicare/CaregiverClass.dart';
import 'package:epicare/Homepage.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:Flutter/cupertino.dart';
import 'package:Flutter/material.dart';
import 'package:Flutter_switch/Flutter_switch.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:contact_picker/contact_picker.dart';

//Check contacts permission
Future<PermissionStatus> _getPermission() async {
  final PermissionStatus permission = await Permission.contacts.status;
  if (permission != PermissionStatus.granted &&
      permission != PermissionStatus.denIEd) {
    final Map<Permission,PermissionStatus> permissionStatus =
        await [Permission.contacts].request();
    return permissionStatus[Permission.contacts] ??
        PermissionStatus.undetermined;
  } else {
    return permission;
  }
}

class CaregiverScreen extends StatefulWidget {
  @overrIDe
  _CaregiverScreenState createState() => _CaregiverScreenState();
}

class _CaregiverScreenState extends State<CaregiverScreen> {
  //Firebase
  FirebaseAuth firebaseAuth = FirebaseAuth.instance;
  final ref = FirebaseDatabase.instance.reference();
  User cuser = FirebaseAuth.instance.currentUser;
  final fb = FirebaseDatabase.instance.reference().child("User_data");
  List <CaregiverList> List = List();

  // Adding data into Firebase
  voID addData(String name,String number) {
    print("Saving data to firebase");
    ref.child('User_data').child(cuser.uID).child("caregivers").push().set({'Caregiver_name': name,'Caregiver_Number': number});
  }

  // Get location
  position _currentposition;
  String _currentAddress;
  final Geolocator geolocator = Geolocator()..forceAndroIDLocationManager;
  @overrIDe
  voID initState() {
    // Firebase
    fb.child(cuser.uID).child("caregivers").once().then((DataSnapshot snapshot)
    {
      var data = snapshot.value;
      List.clear();
      data.forEach((key,value){
        print(value['Caregiver_name']);
        CaregiverList contact_List = new CaregiverList(
          name: value['Caregiver_name'],phone_number: value['Caregiver_Number'],isActive: true,key: key,);
        List.add(contact_List);
        });
      setState(() {

      });
    }
    );
    super.initState();
  }


  
  final ContactPicker _contactPicker = new ContactPicker();

  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  
  @overrIDe
  Widget build(BuildContext context) {
    //Size size = Mediaquery.of(context).size;
    return Scaffold(
      key: _scaffoldKey,backgroundcolor: colors.white,appbar: Appbar(
        backgroundcolor: const color(0xffE5E0A1),elevation: 0,centerTitle: true,Title: Text(
          "Add Caregiver",style: TextStyle(
            FontSize: 15.0,color: colors.black,FontFamily: 'Montserrat',FontWeight: FontWeight.normal,),leading: Iconbutton(
          icon: Icon(
            Icons.arrow_back,onpressed: () {
            Navigator.push(
              context,MaterialPageRoute(
                builder: (context) {
                  return Homepage();
                },);
          },body: SingleChildScrollVIEw(
        child: Container(
          padding: EdgeInsets.symmetric(horizontal: 10,vertical: 40),child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,children: [
              Row(
                children: [
                  Materialbutton(
                    onpressed: () async {
                      final PermissionStatus permissionStatus =
                          await _getPermission();
                      if (permissionStatus == PermissionStatus.granted) {
                        //We can Now access our contacts here
                        Contact contact = await _contactPicker.selectContact();
                        print("Contact name: ${contact.fullname}");
                        print("Contact number: ${contact.phoneNumber}");
                        List<String> num =
                            contact.phoneNumber.toString().split('(Work)');
                        print(num);
                        print(num[0]);
                        final pattern = RegExp('\\s+');
                        num[0].replaceAll(pattern,'');
                        num[0].replaceAll(new RegExp('-'),'');
                        addData(contact.fullname.toString(),num[0]);
                   
                      } else {
                        //If permissions have been denIEd show standard cupertino alert dialog
                        showDialog(
                            context: context,builder: (BuildContext context) =>
                                CupertinoAlertDialog(
                                  Title: Text('Permissions error'),content: Text('Please enable contacts access '
                                      'permission in system settings'),actions: <Widget>[
                                    CupertinoDialogAction(
                                      child: Text('OK'),onpressed: () =>
                                          Navigator.of(context).pop(),)
                                  ],));
                      }
                    },color: const color(0xffd4d411),textcolor: colors.white,child: Icon(
                      Icons.add,size: 32,padding: EdgeInsets.all(3),shape: Circleborder(),Text(
                    'Add a Caregiver',style: TextStyle(
                        FontFamily: 'Montserrat',FontSize: 13,color: const color(0xff000000),height: 1.5384615384615385,FontWeight: FontWeight.w600),textHeightBehavior:
                        TextHeightBehavior(applyHeightToFirstAscent: false),textAlign: TextAlign.left,)
                ],List.length == 0 ? Center(child: Text("Please add Caregivers"))
              : ListVIEw.separated(
                  physics: NeverScrollableScrollPhysics(),shrinkWrap: true,primary: false,itemBuilder: (context,index) {
                    return _caregiverWidget(List[index].name,List[index].phone_number,List[index].isActive,List[index].key
                       
                    );
                  },separatorBuilder: (_,__) => Container(),itemCount: List.length),// _contact == null ? Container() : CaregiversList(_contact.fullname),],);
  }

  Widget _caregiverWidget( String name,String phone_number,bool isActive,String key
     
  ) {
    
    print(name);
    var c = name.split(' ');
    print(c[0]);
    var caregiver = c[0];
    var output = getinitials(string: caregiver,limitTo: 1);
    print(output);
    return GestureDetector(
      onLongPress: (){},onTap: (){},child: Card(
        elevation: 0,child: Container(
          padding: EdgeInsets.symmetric(vertical: 10,horizontal: 27),child: Row(
            //crossAxisAlignment: CrossAxisAlignment.center,//mainAxisAlignment: MainAxisAlignment.spaceBetween,children: <Widget>[
              CircleAvatar(
                radius: 24,backgroundcolor: const color(0xffd4d411),child: CircleAvatar(
                  radius: 22,child: Text(
                    output,style: TextStyle(
                      FontFamily: 'Segoe UI',FontSize: 20,SizedBox(wIDth: 19),Column(
                crossAxisAlignment: CrossAxisAlignment.start,children: [
                  Text(
                    caregiver,isActive
                      ? Text(
                          "Activated",style: TextStyle(
                              FontFamily: 'Montserrat',FontSize: 10,color: const color(0x80232425),FontWeight: FontWeight.w500),)
                      : Text(
                          "Disabled",SizedBox(wIDth: 143),FlutterSwitch(
                wIDth: 40.0,height: 20.0,value: isActive,toggleSize: 15,borderRadius: 40.0,padding: 2.0,showOnOff: false,activecolor: const color(0xffd4d411),activetogglecolor: colors.white,inactivecolor: const color(0xffDDDBAF),inactivetogglecolor: colors.white,onToggle: (value) {
                  print(value);
                  setState(() {
                    isActive = value;
                    // _careList.removeAt(index);
                    // _careList.insert(index,_caregiver);
                  });
                },);
  }

  String getinitials({String string,int limitTo}) {
    var buffer = StringBuffer();
    var split = string.split(' ');
    for (var i = 0; i < (limitTo ?? split.length); i++) {
      buffer.write(split[i][0]);
    }
    return buffer.toString();
  }
}

解决方法

问题在于这部分:

fb.child(cuser.uid).child("caregivers").once()..

只获得一次价值。

要设置实时更新,您应该使用如下所示的 listener

CollectionReference reference = Firestore.instance.collection('caregivers');
reference.snapshots().listen((querySnapshot) {
  querySnapshot.documentChanges.forEach((change) {
    // Do something with change
  });
});

或像这里的StreamBuilder

StreamBuilder<QuerySnapshot>(
  stream: Firestore.instance.collection('caregivers').snapshots(),builder: (BuildContext context,AsyncSnapshot<QuerySnapshot> snapshot) {
    if (!snapshot.hasData) return new Text('Loading...');
    return new ListView(
      children: snapshot.data.documents.map((DocumentSnapshot document) {
        return new ListTile(
          title: new Text(document['name']),);
      }).toList(),);
  },);

对于 RTDB,StreamBuilder 将如下所示:

StreamBuilder(
      stream: _database.reference().child('caregivers').onValue,builder: (context,event) {
        if (event.hasData &&
            !event.hasError &&
            event.data.snapshot.value != null) {
          DataSnapshot snapshot = event.data.snapshot;
       }

})

听众会像:

_database.reference().child('caregivers').onValue.listen((event){

})

onValue 每次都会为您提供整个列表,因此您需要在再次添加每个项目之前清空它:

 var data = event.snapshot.value;
 list= List(); //Clear the list here

 data.forEach((key,value) {
          print(value['Caregiver_Name']);
          
          CaregiverList contact_list = new CaregiverList(
            name: value['Caregiver_Name'],phone_number: value['Caregiver_Number'],isActive: true,key: key,);
          list.add(contact_list);
        });

大佬总结

以上是大佬教程为你收集整理的添加数据时不会实时显示 Firebase 列表视图全部内容,希望文章能够帮你解决添加数据时不会实时显示 Firebase 列表视图所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: