最近几天,我花了大量时间阅读一些SO问题和教程。我想要实现的是,我的flutter应用程序的用户可以选择一个Firebase项目并使用电子邮件/密码登录。登录后,显然,应该显示相应数据库的正确数据。那就是我失败的地方。
一段时间后,阅读了SO的一些站点和问题,然后我转到了以下站点以获取登录名的第一部分。
阅读完本文后,我能够成功登录到定义的firebase项目。
我怎么知道登录成功?我将项目中的用户uid与控制台中我的应用程序中的print语句进行了比较。那就是证明我对非默认项目的配置是正确的。
但是现在我无法解决的主要问题。 登录后,数据始终来自google-service.json中的默认firebase项目。
对于状态管理,我选择了提供程序包,如I / O '19中所述。因此,在main.dart内部,我用MultipleProvider包装了整个应用程序:
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<LoginModel>(
builder: (_) => LoginModel(),
),
ChangeNotifierProvider<Auth>(
builder: (_) => Auth(),
),
],
child: MaterialApp(
title: 'Breaking News Tool',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: RootPage(),
),
);
}
提供的Auth类是一种连接到Firebase SDK的服务,还可以配置非默认应用程序以创建所需的Firebase身份验证
abstract class BaseAuth {
getDefaultAuth();
getAbnAuth();
...
}
class Auth with ChangeNotifier implements BaseAuth {
...
Auth() {
_configureAbnApp();
_configureProdApp();
}
getDefaultAuth() {
_firebaseAuth = FirebaseAuth.instance;
}
getAbnAuth() {
_firebaseAuth = FirebaseAuth.fromApp(_abnApp);
}
_configureAbnApp() {
FirebaseOptions abnOptions = FirebaseOptions(
databaseURL: 'https://[project-id].firebaseio.com',
apiKey: 'AIzaSxxxxxxxxxxxxxxxx,
googleAppID: '1:10591xxxxxxxxxxxxxxxxxxx');
FirebaseApp.configure(name: 'abn_database', options: abnOptions)
.then((result) {
_abnApp = result;
});
}
...
}
登录后,应用程序会将用户重定向到home_page(StatefulWidget)。在这里,我使用数据库的快照来显示数据。
_stream = Firestore.instance.collection(collection).snapshots();
...
Center(
child: Container(
padding: const EdgeInsets.all(10.0),
child: StreamBuilder<QuerySnapshot>(
stream: _stream,
builder:
(BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Text('Loading...');
default:
return ListView(
children: snapshot.data.documents
.map((DocumentSnapshot document) {
return CustomCard(
docID: document.documentID,
title: document[title],
message: document[message],
fromDate: document[fromDate],
endDate: document[endDate],
disableApp: document[disableApp],
);
}).toList(),
);
}
},
),
),
),
一开始,我只有一个项目要连接,并且数据正确。但是,现在我已使用正确的用户uid成功连接到另一个项目,但是数据始终来自google-service.json定义的默认项目。 在这一点上,我不知道为什么会这样。
有人有建议或想法吗?
答案 0 :(得分:1)
您基于` ClientConfig config = new ClientConfig();
HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("admin", "admin123");
Client client = ClientBuilder.newClient(config);
client.register(feature);
WebTarget webTarget = client.target(url);
Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.get();
int respCode = response.getStatus() ;
String policyResponse = response.readEntity(String.class) ;
System.out.println(policyResponse);
System.out.println(response);
System.out.println(respCode);
//Reading the policy search response
return policyResponse;
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
e.printStackTrace();
return e.toString();
}
创建_stream
,这将为您提供默认的firebase应用,如文档所述:
Firestore.instance
因此,您总是从默认项目中获取数据。
要解决此问题,您需要使用/// Gets the instance of Firestore for the default Firebase app.
static Firestore get instance => Firestore();
创建的应用创建您的Firestore。
所以替换:
FirebaseApp.configure()
使用
_stream = Firestore.instance.collection(collection).snapshots();