#firebase #flutter #google-cloud-firestore
# #firebase #флаттер #google-cloud-firestore
Вопрос:
Я видел похожие вопросы, которые были заданы в связи с этим, но моя проблема немного отличается тем, что я сохраняю модульность своего приложения, поэтому я определил следующий метод в другом файле dart (просто класс, а не виджет):
Future getProfile() async {
return await usersCollection.doc(uid).get().then<dynamic>((DocumentSnapshot snapshot) async {
print(snapshot.data()['name']);
if(snapshot.data()['name'] == null){
print("No name exists");
}
else {
return snapshot.data()['name'];
}
});
И я пытаюсь использовать его значение в моем домашнем виджете:
import 'package:flutter/material.dart';
import 'package:carpoolapp/services/auth.dart';
import 'package:carpoolapp/services/database.dart';
import 'package:firebase_auth/firebase_auth.dart';
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
final AuthService _auth = AuthService();
User user = FirebaseAuth.instance.currentUser;
DatabaseService db = DatabaseService(uid: FirebaseAuth.instance.currentUser.uid);
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.redAccent,
appBar: AppBar(
title: Text('Signed in'),
backgroundColor: Colors.blueAccent,
elevation: 0.0, //no drop shadow
actions: <Widget>[
FlatButton.icon(
onPressed: () async {
await _auth.signOutUser();
},
icon: Icon(Icons.person),
label: Text('logout')),
],
),
body: Text(db.getProfile()), // Error is here
//body: UserTile(user: FirebaseAuth.instance().getCurrentUser()),
);
}
}
Как мне заставить это работать, не жертвуя модульностью?
Ответ №1:
Увидев
The argument type 'Future<dynamic>' can't be assigned to the parameter type 'String'
это и
Text(db.getProfile())
проблема в том, что это db.getProfile()
async
метод. Вот почему его будущее не может быть присвоено String
, поскольку ключ данных текстового виджета имеет тип String
not Future<String>
.
Вы можете использовать FutureBuilder
в теле и использовать снимок в тексте, который будет иметь String
значение.
Комментарии:
1. Это сработало! Потрясающе, я забыл о FutureBuilder() .