大佬教程收集整理的这篇文章主要介绍了添加数据时不会实时显示 Firebase 列表视图,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
从电话中选择联系人后,我将联系人信息存储在 Firebase 实时数据库中。 当我添加使用 ListVIEw 和 DataSnapshot 显示的数据时,数据不会实时刷新,直到我重新启动 Activity。 ListVIEw 加载并显示所有数据没有任何问题。我该如何解决这个问题?
我的屏幕如下所示:
屏幕代码:
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,请注明来意。