Тип аргумента ‘Future’ не может быть присвоен типу параметра ‘String’

#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() .