Как отобразить назначенную карту только для определенного пользователя в flutter

# #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. можете ли вы показать мне, как присваивать значения свойствам?