flutter - 登录用户不去主页(颤振)
问题描述
这可能很简单,但我是初学者,我不明白我的错误,我想让已经创建帐户的用户直接进入主页......
当我启动调试时,它告诉:
“错误:在此 Passerelle 小部件上方找不到正确的提供程序
这可能是因为您使用了BuildContext
不包括
您选择的提供者的 a。有几种常见的场景:
您尝试读取的提供程序位于不同的路径中。
提供者是“范围的”。因此,如果您在路由中插入提供程序,那么 其他路由将无法访问该提供程序。
您使用的
BuildContext
是您尝试读取的提供程序的祖先。确保 Passerelle 在您的 MultiProvider/Provider 下。 这通常发生在您创建提供程序并尝试立即读取它时。”
这是我的代码,谢谢你的帮助
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:dogos/HomePage.dart';
import 'package:dogos/pageAuth/inscription.dart';
class Utilisateur {
String idUtil;
Utilisateur({ this.idUtil });
}
class DonneesUtil {
String email;
String nomComplet;
DonneesUtil({ this.email, this.nomComplet });
}
class StreamProviderAuth {
final FirebaseAuth _auth = FirebaseAuth.instance;
//creation d'un obj utilisateur provenant de la classe firebaseUser
Utilisateur _utilisateurDeFirebaseUser(FirebaseUser user){
return user != null ? Utilisateur(idUtil: user.uid) : null;
}
//la difussion de l'auth de l'utilisateur
Stream<Utilisateur> get utilisateur {
return _auth.onAuthStateChanged.map(_utilisateurDeFirebaseUser);
}
}
class Passerelle extends StatefulWidget {
@override
_PasserelleState createState() => _PasserelleState();
}
class _PasserelleState extends State<Passerelle> {
@override
Widget build(BuildContext context) {
final utilisateur = Provider.of<Utilisateur>(context);
if (utilisateur == null) {
return Inscription();
} else {
return HomePage();
}
}
}
class IntroductionPage extends StatefulWidget {
@override
_IntroductionPageState createState() => _IntroductionPageState();
}
class _IntroductionPageState extends State<IntroductionPage> {
FirebaseAuth _auth = FirebaseAuth.instance;
FirebaseUser currentUser;
getCurrentUser() async {
currentUser = await _auth.currentUser();
print("from get getCurrent user ${currentUser.email}");
}
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
Future.delayed(const Duration(milliseconds: 1000), () {
Navigator.push(context,
MaterialPageRoute(builder: (BuildContext context) => Passerelle()));
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
Expanded (
child: Container(
color: Colors.blue,
alignment: Alignment.center,
),
),
Container(
child: Image.asset("assets/logo.jpg"),
),
Expanded (
child:Container(
color: Color(0xff3b57fe),
alignment: Alignment.center,
),
),
],
),
);
}
}
class GetCurrentUserData {
String idUtil;
GetCurrentUserData({ this.idUtil });
//la reference de la collection utilisateur
final CollectionReference collectionUtil = Firestore.instance.collection('utilisateurs');
DonneesUtil _donneesUtilDeSnapshot(DocumentSnapshot snapshot){
return DonneesUtil(
nomComplet: snapshot['nomComplet'],
email: snapshot['emailUtil'],
);
}
//obtention doc util en Stream
Stream<DonneesUtil> get donneesUtil {
return collectionUtil.document(idUtil).snapshots()
.map(_donneesUtilDeSnapshot);
}
}
解决方案
您应该在每个页面中获取当前用户。并且由于您要返回Passerelle
,MaterialPageRoute
因此您应该检查此页面内的当前用户。
推荐阅读
- javascript - 角度 6 中来自 SOAP API 调用的空响应
- php - 当我更改查询参数时,我不断从数据库中获取陈旧的数据
- css - Angularjs 消息框仅显示一个文本框,而与选择的用户无关
- redux - 我不知道,真正的应用程序是什么样子的?
- java - SonarQube 在 Spring Framework 控制器和 Spring Framework Application 主类中显示安全错误
- python - 用漂亮的汤找到按类过滤的href值
- linked-list - 在链表中的第 n 个位置插入节点
- java - 编译错误:找不到符号、变量treeView
- c# - 在数据库中更新时未保存嵌套的拥有类型
- visual-studio-code - 如何在 Ubuntu 中安装 VSCode 扩展