firebase - 错误:_elements.contains(element) 不正确
问题描述
我Firebase Auth
只使用电子邮件和密码。登录应用程序,抽屉正常工作,但再次打开应用程序,(我使用静默登录 - 或自动登录 - 使用 Firebase 方法currentUser
)当我点击抽屉项目时,第二页打开时没有错误,但是当我返回主页,应用程序引发此错误:
主要.dart
home: FutureBuilder<FirebaseUser>(
future: _auth.getCurrentUser(),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
return Container(
child: Loading.load,
color: Colors.white,
);
default:
if (snapshot.hasError)
return Text('Erro: ${snapshot.error}');
else if (snapshot.data == null)
return PageLogin(
auth: Auth(),
);
else
return PageHome();
}
},
));
认证飞镖
class Auth implements BaseAuth {
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
static FirebaseUser _user;
Future<FirebaseUser> getCurrentUser() async {
if (_user == null) {
_user = await _firebaseAuth.currentUser();
}
await loadUserAccess();
return _user;
}
}
page_home.dart
class PageHome extends StatelessWidget {
final _scaffoldKey = new GlobalKey<ScaffoldState>();
final Auth auth = Auth();
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: _loadConnections(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Container(
child: Loading.load,
color: Colors.white,
);
} else {
return Scaffold(
key: _scaffoldKey,
drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: _drawerListItens(context))),
appBar: AppBar(
title: Text("Title"),
body: Container(),
);
}
},
);
}
Future<bool> _loadConnections() async {
try {
if (FirebaseUtil.fbRef() == null) {
await FirebaseUtil.loadReference();
}
//SQLite reference
await DBProvider.db.database;
if (!auth.userIsAdmin()) {
//check if user is admin
await auth.loadUserAccess();
}
return true;
} catch (e) {
return false;
}
}
List<Widget> _drawerListItens(context) {
List<Widget> _drawerItens = List<Widget>();
_drawerItens.addAll([
ListTile(
title: Text("Second Page"),
onTap: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) =>
SecondPage(String someData)));
},
),
]);
return _drawerItens;
}
}
解决方案
重复的键可能会导致此错误。在我的应用程序中,是脚手架key
导致了这个错误。如果您为 Scaffold 和 AppBar 使用基类,则从调用基类的类中传递密钥。例如
Class BaseScaffold{
final GlobalKey<ScaffoldState> _scaffoldKey;
BaseScaffold(this._scaffoldKey);
Widget build(BuildContext context) {
return Scaffold(
key : _scaffoldKey
...
);
}
}
Class B extends StatelessWidget{
final _scaffoldKey = GlobalKey<ScaffoldState>();
Widget build(BuildContext context) {
return BaseScaffold(
key: _scaffoldKey
...
);
}
}
推荐阅读
- javascript - Javascript:删除浏览器控制台中输出数组的空白
- wordpress - WordPress 网站上的 JavaScript 问题
- jsp - 提交表单时出现 java.lang.NullPointerException 错误
- c# - 无法使用 [] 将索引应用于“Castle.Proxies.RangeProxy”类型的表达式
- java - 正则表达式 java 一个正则表达式来提取除最后一个数字之外的字符串
- angular - 如何从 IE(Internet Explorer) 中获取用户的 PC 的 IP
- css - css嵌套模块的状态是什么?
- java - 如何按数字将 int 转换为 Array 数字
- android - 如何忽略在 android lint 中分析整个模块
- jquery - 在 toggleClass 之后保留初始类样式