# #firebase #flutter #dart #google-cloud-firestore
Вопрос:
Я создаю систему, в которой только определенный пользователь может видеть список проектов. Список проектов будет показан в пользовательском приложении, когда проекты будут назначены им через администрацию с помощью электронной почты пользователя. Я использую flutter и Google firebase
Я пытался использовать оператор If else, но, похоже, не могу этого сделать. У меня есть 2 класса моделей
Класс User_model
import 'package:firebase_auth/firebase_auth.dart';
class Users{
final String uid;
Users({this.uid});
}
class UserModel{
String uid;
String email;
String name;
String employeeID;
String phonenumber;
String position;
UserModel({this.uid, this.email, this.name, this.employeeID, this.phonenumber, this.position});
//receiving data from server
factory UserModel.fromMap(map){
return UserModel(
uid: map['uid'],
email: map['email'],
name: map['name'],
employeeID: map['employeeID'],
phonenumber: map['phonenumber'],
position: map['position'],
);
}
//sending data to our server
Map<String, dynamic> toMap(){
return{
'uid': uid,
'email': email,
'name' : name,
'employeeID' : employeeID,
'phonenumber' : phonenumber,
'position' : position,
};
}
}
class UserProject{
final String projectid;
final String address;
final String titleproject;
final List<String> assignedmember ;
UserProject({this.projectid, this.address, this.titleproject, this.assignedmember});
}
Класс Project_model
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
class Project{
final String address;
final String titleproject;
final List<dynamic> assignedmember;
Project({this.address, this.titleproject, this.assignedmember});
}
Рабочий стол.дротик
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:smartconstructionreport/data/project_model.dart';
import 'package:smartconstructionreport/data/user_model.dart';
import 'package:smartconstructionreport/screens/project_screen.dart';
import 'package:smartconstructionreport/theme.dart';
import 'package:smartconstructionreport/widget/ProjectCard.dart';
import 'package:smartconstructionreport/widget/menulist.dart';
import 'package:smartconstructionreport/service/database.dart';
import 'package:provider/provider.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:smartconstructionreport/widget/projectlist.dart';
import 'FloorPlan.dart';
class HomeScreen extends StatefulWidget {
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
User user = FirebaseAuth.instance.currentUser;
UserModel loggedInUser = UserModel();
@override
void initState(){
super.initState();
FirebaseFirestore.instance
.collection("user")
.doc(user.uid)
.get()
.then((value){
this.loggedInUser = UserModel.fromMap(value.data());
setState(() {});
});
}
Widget build(BuildContext context) {
return StreamProvider<List<Project>>.value(
value: DatabaseService().projects,
child: Scaffold(
drawer: menulist(),
appBar: AppBar(
backgroundColor: kPrimaryColor,
centerTitle: true,
title: Image.asset('images/scdr logo.png',
fit: BoxFit.cover,),
),
body: SingleChildScrollView(
child: Padding(
padding: kDefaultPadding,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 30,
),
Text(
"Hello ${loggedInUser.name},",
style: TextStyle(color: Colors.black,
fontSize: 25,
fontWeight: FontWeight.w700),
),
SizedBox(
height: 5,
),
Text(
'Have a great day ahead!',
style: TextStyle(color: Colors.black,
fontSize: 12,
),
),
SizedBox(
height: 5,
),
Text(
'Lets start working!',
style: TextStyle(color: Colors.black,
fontSize: 12,
),
),
SizedBox(
height: 30,
),
Text(
'Project Lists',
style: TextStyle(color: Colors.black,
fontSize: 25,
fontWeight: FontWeight.w700),
),
SizedBox(
height: 18,
),
ProjectList(),
],
),
),
),
),
);
}
}
ProjectList.dart
I tried to add If else statement to check if the project contains email assigned to the project. But it return null
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:provider/provider.dart';
import 'package:smartconstructionreport/data/project_model.dart';
import 'package:smartconstructionreport/screens/project_screen.dart';
import 'ProjectCard.dart';
class ProjectList extends StatefulWidget {
@override
_ProjectListState createState() => _ProjectListState();
}
class _ProjectListState extends State<ProjectList> {
User user = FirebaseAuth.instance.currentUser;
Project projectmember = Project();
@override
Widget build(BuildContext context) {
final projects = Provider.of<List<Project>>(context) ?? [];
return ListView.builder(
shrinkWrap: true,
itemCount: projects.length,
itemBuilder: (context, index) {
if (projectmember.assignedmember.contains(user.email)) {
return ProjectCard(project: projects[index],
press: () {
Navigator.push(context, MaterialPageRoute(
builder: (context) => ProjectScreen(),
));
},
);
};
}
);
}
}
Проектная карта.дротик
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:smartconstructionreport/data/project_model.dart';
import 'package:smartconstructionreport/theme.dart';
class ProjectCard extends StatelessWidget {
final Function press;
final Project project;
ProjectCard({this.project, this.press});
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return GestureDetector(
onTap: press,
child: Card(
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0)
),
elevation: 10,
margin: EdgeInsets.fromLTRB(5.0, 15.0, 5.0, 10.0),
child: Column(
children: [
Stack(
alignment: Alignment.center,
children: [
Padding(
padding: const EdgeInsets.all(2.0),
child: Text(
project.titleproject,
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.bold,
),
),
)
],
),
Divider(color: Colors.black),
Padding(
padding: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 0.0),
child: Text(
project.address,
style: TextStyle(fontSize: 14),),
),
Row(
children: [
Column(
children: [
TextButton.icon(
onPressed: (){},
icon: Icon(Icons.person,
color: kPrimaryColor,) ,
label: Text('Project Manager')),
],
),
SizedBox(width:50),
Column(
children: [
TextButton.icon(
onPressed: (){},
icon: Icon(Icons.location_pin,
color: kPrimaryColor,) ,
label: Text('MAP')),
],
)
],
),
],
),
),
);
}
}
Ошибка
======== Exception caught by widgets library =======================================================
The method 'contains' was called on null.
Receiver: null
Tried calling: contains("rashid@fyp.com")
====================================================================================================
Комментарии:
1. cna u показывает, где вы используете это содержит(«rashid@fyp.com») в кодексе…
2. это из облачного магазина firestore, данные электронной почты («rashid2@fyp,com») уже есть в базе данных.
3. здесь говорится, что contains был вызван на null, что означает, что список, который вы вызываете, равен null, поэтому вы должны проверить наличие null. прежде чем получить значение.
4. Вы определили
Project projectmember = Project();
так, что все свойства (address
,titleproject
,assignedmember
) будут равны нулю.projectmember.assignedmember.contains()
попытается вызвать contains() на null, и это выдаст эту ошибку. Итак, дайте значения свойствамprojectmember
.5. @PeterO. можете ли вы показать мне, как присваивать значения свойствам?