bu hatayı bir kaç yerde daha aldım. işin ilginç yanı benzer şekilde kullandığım bazı yerlerde alıyorum ama bazı yerlerde almıyorum. kullanma tarzım hep burada kullandığım gibi. firebase Cloud FireStore’ dan liste çağırıyorum. bazen sıkıntısız şekilde geliyor bazen bu hata ile geliyor. Sayfamın kodları aşağıda. Kodum çok uzun amatör kodu işte. burada telefon ile giriş yap butonuna basığımda hatayı alıyorum ama aynı mantıkla kodladığım
Google ile giriş yap butonunda aynı hatayı almıyorum.
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:sby_cpal_demo/Helpers/AtaWidget.dart';
import 'package:sby_cpal_demo/Helpers/SignInProvider.dart';
import 'package:sby_cpal_demo/Pages/SinifListeleriPage.dart';
import 'package:sby_cpal_demo/main.dart';
import 'package:flutter_signin_button/flutter_signin_button.dart';
import 'package:flutter_signin_button/button_list.dart';
class GirisPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return GirisPageState();
}
}
class GirisPageState extends State<GirisPage> {
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
final FirebaseAuth _auth = FirebaseAuth.instance;
TextEditingController _emailController = TextEditingController();
TextEditingController _passwordController = TextEditingController();
TextEditingController _schoolNoController = TextEditingController();
final _formKey = GlobalKey<FormState>();
bool _success;
String _message;
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
//resizeToAvoidBottomPadding: false,
backgroundColor: Colors.white,
appBar: AppBar(
leading: Icon(Icons.account_box),
title: Text("GİRİŞ"),
actions: <Widget>[
IconButton(
icon: Icon(Icons.home),
onPressed: () {
if(AtaWidget.of(context).kullaniciadi == "" || AtaWidget.of(context).kullaniciadi == " "
|| AtaWidget.of(context).kullaniciadi == null ){
AlertDialog alertDialog = new AlertDialog(title: Text("*UYARI: "), content: Text("Kayıt yada giriş işlemi "
"tamamlanmandan sayfadan çıkmak üzeresiniz!!", style: TextStyle(color: Colors.orange),),
actions: [
RaisedButton(
child: Text("Yine de Çık"), color: Colors.green,
onPressed: (){
AtaWidget.of(context).kayitadi = null;
goToMyHomePage();
Navigator.of(context,rootNavigator: true).pop("dialog");
},
),
],);
showDialog(context: context, builder: (_)=> alertDialog);
} else { goToMyHomePage(); }
},
),
Builder(
builder: (context)=>IconButton(
icon: Icon(Icons.logout), onPressed: ()async{
await _auth.signOut();
setState(() {
AtaWidget.of(context).kullaniciadi = " ";
AtaWidget.of(context).kullanicimail = " ";
_success = null;
AtaWidget.of(context).personelGiris = false;
AtaWidget.of(context).ogrenciGiris = false;
});
if (await GoogleSignIn().isSignedIn()) {
print("google user");
await GoogleSignIn().disconnect();
await GoogleSignIn().signOut();
}
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => MyHomePage()));
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("Başarıyla çıkış yapıldı"),
));
}),
)
],
),
body: Center(
child: Form(
key: _formKey,
child: Padding(
padding: const EdgeInsets.only(left: 36.0, right: 36),
child: ListView(
// mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(height: 30,),
ListTile(
leading: Icon(Icons.warning_amber_rounded, color: Colors.red[500], size: 30),
title: Text("Google ile direkt giriş yapabilirsiniz. İlk giriş için erişim izni istenebilir.",
style: TextStyle(color: Colors.redAccent, fontSize: 17, fontStyle: FontStyle.italic, fontWeight: FontWeight.w500),),
),
Visibility(visible: AtaWidget.of(context).personelGiris,
child: ListTile(
leading: Icon(Icons.warning_amber_rounded, color: Colors.red[500], size: 30),
title: Text("Güvenlik sebebiyle personel girişleri için mail ile giriş yerine telefon numarası ile giriş aktif edilmiştir ",
style: TextStyle(color: Colors.redAccent, fontSize: 17, fontStyle: FontStyle.italic, fontWeight: FontWeight.w500),),
),
),
Visibility(visible: AtaWidget.of(context).ogrenciGiris,
child: ListTile(
leading: Icon(Icons.warning_amber_rounded, color: Colors.red[500], size: 30),
title: Text("Mail ile ilk girişte kaydolmanız gerekmektedir. Daha sonraki girişlerinizi okul no, mail adresi "
"ve şifreyle yapabilirsiniz.",
style: TextStyle(color: Colors.redAccent, fontSize: 17, fontStyle: FontStyle.italic, fontWeight: FontWeight.w500),),
),
),
Divider( thickness: 1, color: Colors.black,
),
SizedBox(height: 40,),
Visibility(visible: AtaWidget.of(context).ogrenciGiris,
child: Center(
child: Text("**Mail ile girişte okul numaranızı girmeniz gerekmektedir. Daha önce kaydettiğiniz kullanıcı adınız sistemden otomatik olarak "
" çekilecektir. Bilgilerinizde değişiklik yapmak için herhangi bir öğretmene başvurmanız gerekmektedir.**",
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold, fontStyle: FontStyle.italic, color: Colors.orange),
textAlign: TextAlign.center),
),
),
Visibility(visible: AtaWidget.of(context).personelGiris,
child: Center(
child: Text("**Telefon ile giriş yapmak için karşınıza gelen personel listesinden kişiyi seçmeniz yeterlidir. Sistemde "
"kayıtlı numaranıza gönderilen sms sonrası otomatik olarak giriş yapmış olacaksınız. Sms 1 dk içinde gelecektir.",
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold, fontStyle: FontStyle.italic, color: Colors.orange),
textAlign: TextAlign.center),
),
),
SizedBox(height: 10,),
Visibility(visible: AtaWidget.of(context).kayittan,
child: ListTile(
title: AtaWidget.of(context).kayitadi == null ? Text(" Kayıt adı girilmedi"):
Text(AtaWidget.of(context).kayitadi, style: TextStyle(color: Colors.green, fontWeight: FontWeight.bold),),
subtitle: Text("kullanıcı adınız bir önceki adımda girdiğiniz ad/soyad olarak belirlenmiştir."),
),
),
Visibility(visible: AtaWidget.of(context).ogrenciGiris == true && AtaWidget.of(context).kayittan == false ? true
: false,
child: TextFormField(
controller: _schoolNoController,
keyboardType: TextInputType.number,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide( color: Colors.purple, width: 2,),
),
labelText: "Okul numaranızı giriniz",
labelStyle: TextStyle(color: Colors.purple),
border: OutlineInputBorder()),
validator: (value) {
if (value.isEmpty) {return "Okul numaranızı girmelisiniz.";
} else {return null;
}
},
onSaved: (value) {},
),
),
Visibility(visible: AtaWidget.of(context).ogrenciGiris, child: SizedBox(height: 20,)),
Visibility(visible: AtaWidget.of(context).ogrenciGiris,
child: TextFormField(
controller: _emailController,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.purple, width: 2,),
),
labelText: "E-mail",
labelStyle: TextStyle(color: Colors.purple),
border: OutlineInputBorder()),
validator: (value) {
if (value.isEmpty) {return "Kullanıcı E-mailinizi giriniz";
} else {return null;
}
},
onSaved: (value) {},
),
),
Visibility(visible: AtaWidget.of(context).ogrenciGiris, child: SizedBox(height: 20,)),
Visibility(visible: AtaWidget.of(context).ogrenciGiris,
child: TextFormField(
controller: _passwordController,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.purple, width: 2,),
),
labelText: "Şifre",
labelStyle: TextStyle(color: Colors.purple),
border: OutlineInputBorder()),
validator: (value) {
if (value.isEmpty) {return "Şifrenizi Giriniz";
} else {return null;
}
},
onSaved: (value) {},
),
),
Visibility(visible: AtaWidget.of(context).ogrenciGiris,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Visibility( visible: AtaWidget.of(context).kayittan == true ? true : false,
child: MaterialButton(
child: Text("KAYDOL",
style: TextStyle(fontSize: 17, color: Colors.green),),
onPressed: () {
_register();
}),
),
Visibility( visible: !AtaWidget.of(context).kayittan,
child: RaisedButton(
color: Colors.blue,
child: Text("GİRİŞ",
style: TextStyle(fontSize: 17),
),
onPressed: () {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
_signIn();
}
}),
),
],
),
),
SizedBox(height: 20,),
Visibility(visible: AtaWidget.of(context).personelGiris,
child: FloatingActionButton.extended(
icon: Icon(Icons.phone_rounded, color: Colors.black,), backgroundColor: Colors.indigoAccent,
label: Text("Telefon ile giriş yap", style: TextStyle(fontWeight: FontWeight.bold)),
onPressed: () async {
Widget setupAlertDialogContainer() {
return Container(
height: 300, width: 300,
child: StreamBuilder(
stream: FirebaseFirestore.instance.collection("kadro_ogrt").orderBy("sıra").snapshots(),
builder: (context, snapshot){
final _querySnapshot = snapshot.data;
return ListView.builder(
itemCount: _querySnapshot.size,
itemBuilder: (BuildContext context, int index){
final map = _querySnapshot.docs[index].data();
return Column(
children: [
ListTile(
title: Text(map["isim"],
style: TextStyle(fontWeight: FontWeight.bold, fontStyle: FontStyle.italic)),
onTap: (){
Navigator.of(context, rootNavigator: true).pop('dialog');
_signInWithPhone(map["tel"], map["isim"]);
},),
Divider(thickness: 1,),]);
});
}),
);
}
showDialog(context: context, builder: (_) {
return AlertDialog(
title: Text("PERSONEL LİSTESİ"),
content: setupAlertDialogContainer(),
);
});
}),
),
SizedBox(height: 20,),
SignInProvider(
infoText: "Google ile giriş yap",
buttonType: Buttons.Google,
signInMethod: () async {
Widget setupAlertDialogContainer() {
return Container(
height: 500, width: 300,
child: StreamBuilder(
stream: AtaWidget.of(context).personelGiris == true ?
FirebaseFirestore.instance.collection("kadro_ogrt").orderBy("sıra").snapshots()
: FirebaseFirestore.instance.collection("siniflar").snapshots(),
builder: (context, snapshot){
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator(),
);
} else if (snapshot.hasError) {
return Center(child: Icon(Icons.error, size: 40),
);
} else if (snapshot.data == null) {
return Center( child: CircularProgressIndicator(),
);
}
final querySnapshot = snapshot.data;
if(AtaWidget.of(context).personelGiris == true){
return ListView.builder(
itemCount: querySnapshot.size,
itemBuilder: (BuildContext context, int index){
final map = querySnapshot.docs[index].data();
return Column(
children: [
ListTile(
title: Text(map["isim"],
style: TextStyle(fontWeight: FontWeight.bold, fontStyle: FontStyle.italic)),
onTap: ()async{
if(map["mail"] == "" || map["mail"] == " " || map["mail"] == null ){
Navigator.of(context, rootNavigator: true).pop('dialog');
AlertDialog alertDialog = new AlertDialog(
title: Text("Hata: "), content: Text("Güvenlik sebeiyle Google ile giriş "
"yapabilmeniz için sisteme kayıtlı bir gmail hesabınız olmalıdır. Telefonla "
"giriş yaptıktan sonra GMAİL adresinizi **KADROMUZ** bölümünden kendi "
"sayfanıza ekleyerek Google ile girişi kullanabilirsiniz."),
);
showDialog(context: context, builder: (_) => alertDialog);
} else {
// AtaWidget.of(context).kullaniciadi = map["isim"];
Navigator.of(context, rootNavigator: true).pop('dialog');
_signInWithGoogle(map["mail"], map["isim"]);
}
},),
Divider(thickness: 1,),]);
});
} else {
return GridView.builder(
shrinkWrap: true,
itemCount: querySnapshot.size,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
mainAxisSpacing: 10, crossAxisSpacing: 10, crossAxisCount: 3),
itemBuilder: (context, index) {
final map = querySnapshot.docs[index].data();
final id = querySnapshot.docs[index].id;
return Container(
color: Colors.blueGrey,
child: GestureDetector(
onTap: ()async{
Navigator.push(context, MaterialPageRoute(builder: (context)=>
SinifListeleriPage(map: map, id: id)));
},
child: GridTile(
child: Center(
child: Text(map["sinif"], style: TextStyle(color: Colors.black,
fontWeight: FontWeight.bold, fontSize: 18), textAlign: TextAlign.center,),
),
),
),
);
});
}
}),
);
}
showDialog(context: context, builder: (_) {
return AlertDialog(
title: Text("SINIF LİSTESİ"),
content: setupAlertDialogContainer(),
);
});
} , // TODO: Google ile giriş
),
SizedBox(height: 20,),
Container(
alignment: Alignment.center,
child: SingleChildScrollView(
physics: ClampingScrollPhysics(),
child: Center(
child: Text(_success == null ? '' : _message ?? '',
style: TextStyle(backgroundColor: Colors.yellow, fontWeight: FontWeight.bold,
fontSize: 17, color: Colors.black),
textAlign: TextAlign.center,),
),
)
),
],
),
)),
),
);
}
@override
void dispose() {
//! Widget kapatıldığında controllerları temizle
_schoolNoController.dispose();
_emailController.dispose();
_passwordController.dispose();
super.dispose();
}
void _register() async {
String id_kayit;
if(AtaWidget.of(context).kullaniciadi == "" || AtaWidget.of(context).kullaniciadi == " " ||
AtaWidget.of(context).kullaniciadi == null ){
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
try {
final UserCredential userCredential = await _auth.createUserWithEmailAndPassword(
email: _emailController.text.trim(),
password: _passwordController.text.trim());
final User user = userCredential.user;
if (user != null) {
setState(() {
AtaWidget.of(context).kullanicimail = user.email.trim();
AtaWidget.of(context).kullaniciadi = AtaWidget.of(context).kayitadi;
_message = "Merhaba ${AtaWidget.of(context).kullaniciadi}";
_success = true;
});
await FirebaseFirestore.instance.collection("ogrenciler").where("isim", isEqualTo: AtaWidget.of(context).kullaniciadi)
.limit(1).get().then((value) => value.docs.forEach((doc) {
debugPrint(doc.id.toString());
id_kayit = doc.id.toString();
}));
await FirebaseFirestore.instance.collection("ogrenciler").doc(id_kayit)
.update({"kullaniciadi": AtaWidget.of(context).kullaniciadi, "mail": AtaWidget.of(context).kullanicimail});
_scaffoldKey.currentState.showSnackBar(SnackBar(content: Text("Merhaba ${AtaWidget.of(context).kullaniciadi}")));
debugPrint("Kayıt işlemi başarılı ile gerçekleştirildi");
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context)=>MyHomePage()));
} else {
setState(() {
_message = "hata gerçekleşti";
_success = false;
});
}
} on FirebaseAuthException catch (er) {
setState(() {
_message = er.message;
_success = false;
});
} catch (e) {
print(e.toString());
}
}
}
else {
setState(() {
_message = "*HATA: Önce uygulamadan çıkış yapmalısınız.";
_success = false;
});
}
}
void _signIn() async {
String doc_isim; String doc_kullaniciadi; String doc_mail;
String schoolNoS = _schoolNoController.text.trim();
int schoolNo = int.parse(schoolNoS);
if (AtaWidget.of(context).kullaniciadi == "" || AtaWidget.of(context).kullaniciadi == " " ||
AtaWidget.of(context).kullaniciadi == null ) {
await FirebaseFirestore.instance.collection("ogrenciler").where("no", isEqualTo: schoolNo)
.get().then((QuerySnapshot querySnapshot)=>{
querySnapshot.docs.forEach((doc) {
debugPrint(doc["isim"] + " " + doc["no"].toString()+" kullanıcı adı: " + doc["kullaniciadi"]
+ " kullanıcı maili: " + doc["mail"]);
doc_isim = doc["isim"]; debugPrint("isim: " + doc_isim);
doc_kullaniciadi = doc["kullaniciadi"];
debugPrint("firebase kullanıcı adı: "+doc_kullaniciadi);
doc_mail = doc["mail"];
})
});
if(doc_mail != _emailController.text.trim()){
setState(() {
_message = "*HATA: okul numurası ile mail adresi uyuşmuyor. ";
_success = false;
});
} else{
try {
final UserCredential userCredential = await _auth
.signInWithEmailAndPassword(
email: _emailController.text.trim(), password: _passwordController.text.trim());
final User user = userCredential.user;
debugPrint(user.email.toString());
setState(() {
AtaWidget.of(context).kullanicimail = user.email;
AtaWidget.of(context).kullaniciadi = doc_kullaniciadi;
});
debugPrint("atawidget kullanicimail: " + AtaWidget.of(context).kullanicimail.toString());
debugPrint("atawidget kullaniciadi: " + AtaWidget.of(context).kullaniciadi.toString());
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context)=>MyHomePage()));
} on FirebaseAuthException catch (e) {
setState(() {
_message = e.toString();
_success = false;
});
} catch (e) {
setState(() {
_message = e.toString();
_success = false;
});
}
}
}
else {
setState(() {
_message = "*HATA: Önce uygulamadan çıkış yapmalısınız.";
_success = false;
});
}
}
void _signInWithPhone(String no, String isim) async {
if (AtaWidget.of(context).kullaniciadi == "" || AtaWidget.of(context).kullaniciadi == " " ||
AtaWidget.of(context).kullaniciadi == null ) {
_auth.verifyPhoneNumber(
phoneNumber: no, timeout: Duration(seconds: 120),
verificationCompleted: (AuthCredential credential) async {
final UserCredential userCredential = await _auth.signInWithCredential(credential);
final User user = userCredential.user;
setState(() {
AtaWidget.of(context).kullaniciadi = isim;
});
debugPrint("atawidget: " + AtaWidget.of(context).kullaniciadi);
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => MyHomePage(),));
},
verificationFailed: (FirebaseAuthException e) {
setState(() {
_message = e.toString();
_success = false;
});
},
codeSent: (String verificationId, int resendToken) async {
// Update the UI - wait for the user to enter the SMS code
String smsCode = 'xxxx';
// Create a PhoneAuthCredential with the code
PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider
.credential(verificationId: verificationId, smsCode: smsCode);
// Sign the user in (or link) with the credential
await _auth.signInWithCredential(phoneAuthCredential);
},
codeAutoRetrievalTimeout: (String verificationId) {
// Auto-resolution timed out...
},
);
} else {
setState(() {
_message = "*HATA: Önce uygulamadan çıkış yapmalısınız.";
_success = false;
});
}
}
_signInWithGoogle(String mail, String isim) async{
if (AtaWidget.of(context).kullaniciadi == "" || AtaWidget.of(context).kullaniciadi == " " ||
AtaWidget.of(context).kullaniciadi == null ) {
try {
final GoogleSignInAccount googleUser = await GoogleSignIn().signIn();
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
final GoogleAuthCredential credential = GoogleAuthProvider.credential(
accessToken: googleAuth.accessToken, idToken: googleAuth.idToken
);
final UserCredential userCredential = await _auth.signInWithCredential(credential);
final User user = userCredential.user;
debugPrint(user.email.toString());
if(user.email.toString() == mail){
AtaWidget.of(context).kullaniciadi = isim;
debugPrint("atawidget: "+AtaWidget.of(context).kullaniciadi);
setState(() {});
Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context)=> MyHomePage(),));
} else {
AlertDialog alertDialog = new AlertDialog(
title: Text("Hata: "), content: Text("Seçilen kullanıcı adı ile sistemde kayıtlı mail adresi uyuşmamaktadır. "
"Lütfen kullanıcı adını doğru seçtiğinizden emin olunuz. "),
);
showDialog(context: context, builder: (_) => alertDialog);
await _auth.signOut();
setState(() {
AtaWidget.of(context).kullaniciadi = " ";
AtaWidget.of(context).kullanicimail = " ";
});
if (await GoogleSignIn().isSignedIn()) {
print("google user");
await GoogleSignIn().disconnect();
await GoogleSignIn().signOut();
}
}
} on FirebaseAuthException catch(e){
setState(() {
_message = e.toString();
_success = false;
AtaWidget.of(context).kullaniciadi = " ";
});
} catch (e) {
setState(() {
_message = e.toString();
_success = false;
AtaWidget.of(context).kullaniciadi = " ";
});
}
}
else {
setState(() {
_message = "*HATA: Önce uygulamadan çıkış yapmalısınız.";
_success = false;
});
}
}
void goToMyHomePage() async {
await Navigator.push(context, MaterialPageRoute(builder: (context) => MyHomePage()));
}
void goToGirisPage() async {
await Navigator.push(context, MaterialPageRoute(builder: (context) => GirisPage()));
}
}
Terminal çıktım da şu şekilde:
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following NoSuchMethodError was thrown building StreamBuilder<QuerySnapshot>(dirty, state: _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#12628):
The getter 'size' was called on null.
Receiver: null
Tried calling: size
The relevant error-causing widget was:
StreamBuilder<QuerySnapshot> file:///C:/ornekler/sby_cpal_demo/lib/Pages/GirisPage.dart:242:36
When the exception was thrown, this was the stack:
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1 GirisPageState.build.<anonymous closure>.setupAlertDialogContainer.<anonymous closure> (package:sby_cpal_demo/Pages/GirisPage.dart:247:65)
#2 StreamBuilder.build (package:flutter/src/widgets/async.dart:525:81)
#3 _StreamBuilderBaseState.build (package:flutter/src/widgets/async.dart:129:48)
#4 StatefulElement.build (package:flutter/src/widgets/framework.dart:4744:28)
...
════════════════════════════════════════════════════════════════════════════════════════════════════
yardımı dokunan olursa çok sevinirim.