我正在尝试使用一些方法来创建模型类,以简化从Firebase检索信息的过程。
我有一个“未注册”页面,用户单击“使用Google登录”按钮。如果我的用户已经注册,它将检查数据库以查看他是否完成了个人资料,否则它将使用字段profileCompleted: false
将基本数据写入数据库,并将用户重定向到个人资料页面,以便他可以完成自己的个人资料。
我在这里尝试使用模型,但遇到各种错误(刚开始学习颤振/飞镖)。
我将分享一些代码,如果代码不够,请告诉我!
未注册页面。
if (user != null) {
await prefs.setString('id', user.uid);
// Check is already sign up
final QuerySnapshot result = await Firestore.instance
.collection('users')
.where('id', isEqualTo: user.uid)
.getDocuments();
final List<DocumentSnapshot> documents = result.documents;
if (documents.length == 0) {
debugPrint("User not in DB ?");
//debugPrint(userInfo.toString());
// Update data to server if new user
Firestore.instance.collection('users').document(user.uid).setData({
'id': user.uid,
'nickname': user.displayName,
'photoUrl': user.photoUrl,
'email': user.email,
'createdAt': DateTime.now(),
'provider': user.providerId,
'profileCompleted': false,
'bloodType': 'A',
'rhType': 'Negativ',
'donatedBefore': 'Nu',
'lastDonation': '0'
});
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CompleteProfile(
currentUserId: user.uid,
userInfo: documents.single,
)));
} else if (documents.single["profileCompleted"] == false) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CompleteProfile(
currentUserId: user.uid,
userInfo: documents.single,
)));
} else {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => HomePage(
currentUserId: user.uid,
userInfo: documents.single,
)));
}
}
完整的个人资料页面
class CompleteProfile extends StatefulWidget {
final String currentUserId;
final userInfo;
static const routeName = '/profile';
final User user;
CompleteProfile(
{Key key,
this.title,
@required this.currentUserId,
@required this.userInfo,
this.user})
: super(key: key);
final String title;
@override
_CompleteProfileState createState() => _CompleteProfileState(user,
currentUserId: this.currentUserId, userInfo: this.userInfo);
}
class _CompleteProfileState extends State<CompleteProfile> {
User user;
_CompleteProfileState(this.user,
{Key key, @required this.currentUserId, @required this.userInfo});
final String currentUserId;
final userInfo;
我的问题是,如果我尝试设置这样的下拉菜单->
child: ListTile(
title: DropdownButton<String>(
items: _bloodTypes.map((String value) {
return DropdownMenuItem<String>(
value: value, child: Text(value));
}).toList(),
style: textStyle,
value: retrieveBloodType(user.bloodType),
onChanged: (value) => updateBloodType(value),
并使用默认值->
String retrieveBloodType(String value) {
return _bloodType;
}
我收到一个错误,提示我将变为null。
我的想法是使用User
之类的东西来初始化User user = new User(userInfo["id"],userInfo["email"]....
模型,其中userInfo
是从firebase检索的对象。但是,这引发了另一个错误,即在初始化器中只能访问静态成员。
我的模型非常简单,所以这是一个偷看(几行,而不是整个模型)。
class User {
int _id;
String _nickname;
int get id => _id;
String get nickname => _nickname;
set bloodType(String newBloodType) {
if (newBloodType.length <= 50 && newBloodType != null) {
_bloodType = newBloodType;
}
}
关于id必须如何更改才能起作用的任何想法?我考虑使用模型的唯一原因是简化了屏幕小部件(因此我可以将所有Firebase逻辑而不是小部件添加到模型中)。
答案 0 :(得分:1)
这就是我要做的
import 'package:cloud_firestore/cloud_firestore.dart';
class User {
final String userName;
final String email;
final String name;
final String phoneNumber;
final String profilePictureUrl;
final Timestamp creationDate;
const User(
this.userName,
this.email,
this.name,
this.phoneNumber,
this.profilePictureUrl,
this.creationDate
);
factory User.fromDocument(DocumentSnapshot document) {
return User(
document['userName'],
document['email'],
document['name'],
document['phoneNumber'],
document['profilePictureUrl'],
document['creationDate']
);
}
答案 1 :(得分:0)
如果模型看起来像这样会更好:
class User {
final String userName;
final String email;
User({
this.userName,
this.email,
});
User.fromMap(Map map)
: this(
userName : map['userName'],
email : map['email'],
);
Map<Stringm dynmic> asMap() => {
'userName' : userName,
'email' : email,
}
然后您可以使用此模型如下将数据设置为firebase
Firestore.instance.collection('users').document(user.uid).setData(user.asMap)