Получить данные из FireStore для страницы профиля с помощью провайдера флаттера - PullRequest
0 голосов
/ 22 января 2020

Я пытался получить данные из магазина, используя пакет поставщика для создания страницы профиля. У меня нет красной ошибки на экране, он может выбирать данные из пользовательского интерфейса, но не отображает данные на другой странице. Я пробовал много раз, но я думаю, что мой код базы данных для потоковой передачи данных неверен. Я не знаю, как мне писать коды для потоковой передачи данных в пользовательский интерфейс?


class DatabaseGuru {
  final String uid;

  DatabaseGuru({this.uid});

  final FirebaseAuth auth = FirebaseAuth.instance;
  final CollectionReference dataGuru = Firestore.instance.collection('Guru');

//  UPDATE DATA From UI
  Future updateUserData(
    String namaGuru,
    String nipGuru,
    String emailGuru,
    String waliKelas,
  ) async {
    FirebaseUser user = await auth.currentUser();
    return await dataGuru.document(user.uid).setData({
      'nama': namaGuru,
      'nip': nipGuru,
      'email': emailGuru,
      'wali kelas': waliKelas,
    });
  }


//    STREAM From Firestore to UI
  DataGuru _dataGuruFromSnapshot(DocumentSnapshot snapshot) {
    return DataGuru(
      uid: uid,
      namaGuru: 'nama',
      nipGuru: 'nip',
      emailGuru: 'email',
      waliKelas: 'wali kelas',
    );
  }

  Stream<DataGuru> get Guru {
    return dataGuru.document(uid).snapshots().map(_dataGuruFromSnapshot);
  }

  //  GET DATA FROM UI
  DataGuru _userDataFromSnapshot(DocumentSnapshot snapshot) {
    return DataGuru(
      uid: uid,
      namaGuru: snapshot.data['nama'],
      nipGuru: snapshot.data['nip'],
      emailGuru: snapshot.data['email'],
      waliKelas: snapshot.data['wali kelas'],
    );
  }

  Stream<DataGuru> get userData {
    return dataGuru.document(uid).snapshots().map(_userDataFromSnapshot);
  }
}

тем временем вот мой код пользовательского интерфейса

class ProfilGuru extends StatefulWidget {
  @override
  _ProfilGuruState createState() => _ProfilGuruState();
}

class _ProfilGuruState extends State<ProfilGuru> {
  @override
  Widget build(BuildContext context) {
    final Guru = Provider.of<DataGuru>(context);


    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 8.0),
        child: StreamBuilder(
          builder: (context, _){
            return DataProfil(guru: Guru);
          },
           ),
      ),
      floatingActionButton: FloatingActionButton(
          backgroundColor: Color(0xFF3498BB),
          onPressed: () {
            Navigator.push(context,
                MaterialPageRoute(builder: (context) => ProfilEditor()));
          },
          child: Icon(
            Icons.edit,
            color: Colors.white,
          )),
    );
  }
}

class DataProfil extends StatelessWidget {
  final DataGuru guru;
  DataProfil({this.guru});

  @override
  Widget build(BuildContext context) {
    return Column(children: <Widget>[
      SizedBox(
        height: 16,
      ),
      Stack(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Expanded(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Text(
                      guru.namaGuru,
                      style: TextStyle(
                        fontFamily: 'Montserrat',
                        fontSize: 20,
                        color: Colors.black87,
                      ),
                    ),
                    SizedBox(
                      height: 8.0,
                    ),
                    Text(
                      'NIP: ' + guru.nipGuru,
                      style: TextStyle(
                          fontFamily: 'Montserrat',
                          fontSize: 16,
                          color: Colors.black87),
                    )
                  ],
                ),
              ),
              CircleAvatar(
                backgroundColor: Color(0xFF3498BB),
                radius: 54,
                child: Icon(
                  Icons.photo_camera,
                  color: Colors.white,
                  size: 40,
                ),
              )
            ],
          ),
        ],
      ),
      SizedBox(
        height: 36,
      ),
      subJudul(judul: 'EMAIL'),
      Row(
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          Container(
            decoration: BoxDecoration(
                color: Color(0xFF7f8c8d),
                borderRadius: BorderRadius.circular(8.0)),
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text(
                guru.emailGuru,
                style: TextStyle(
                    fontFamily: 'Montserrat',
                    fontSize: 16,
                    color: Colors.white),
              ),
            ),
          )
        ],
      ),
      SizedBox(
        height: 16,
      ),
      Divider(
        color: Color(0xFF7f8c8d),
      ),
      SizedBox(
        height: 16,
      ),
      subJudul(judul: 'PELAJARAN'),
      Container(
        alignment: Alignment.centerLeft,
        child: Wrap(
          spacing: 8.0,
          runSpacing: 8.0,
          direction: Axis.horizontal,
          runAlignment: WrapAlignment.start,

          children: <Widget>[
            Container(
              decoration: BoxDecoration(
                  color: Color(0xFFd35400),
                  borderRadius: BorderRadius.circular(8.0)),
              child: Padding(
                padding: const EdgeInsets.all(8.0),
                child: Text(
                  'Bahasa Indonesia',
                  style: TextStyle(
                      fontFamily: 'Montserrat',
                      fontSize: 16,
                      color: Colors.white),
                ),
              ),
            ),

          ],
        ),
      ),
      SizedBox(
        height: 16,
      ),
      Divider(
        color: Color(0xFF7f8c8d),
      ),
      SizedBox(
        height: 16,
      ),
      subJudul(
        judul: 'WALI KELAS',
      ),
      Row(
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          Container(
            decoration: BoxDecoration(
                color: Color(0xFF7f8c8d),
                borderRadius: BorderRadius.circular(8.0)),
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text(
                guru.waliKelas,
                style: TextStyle(
                    fontFamily: 'Montserrat',
                    fontSize: 16,
                    color: Colors.white),
              ),
            ),
          )
        ],
      ),
      SizedBox(
        height: 16,
      ),
    ]);
  }
}

...