본문 바로가기

개발하자

미래의 인스턴스 <String?문자열 데이터 플러터/파이어베이스 대신 >'

반응형

미래의 인스턴스 <String?문자열 데이터 플러터/파이어베이스 대신 >'

파이어베이스에서 데이터를 꺼내는 데 문제가 있었는데, 현재 'Future<String?의 인스턴스가 계속 반환됩니다."환자" 또는 "물리치료사"의 문자열 대신 >' 문제가 무엇인지 알 수 있을까요?

class Wrapper extends StatefulWidget {

  @override
  _WrapperState createState() => _WrapperState();
}

class _WrapperState extends State<Wrapper> {
  Future<String?> getUserType(String uid) async {
    try {
      DocumentSnapshot _docSnapShot = await FirebaseFirestore.instance.collection('users').doc(uid).get();
      var userType = await ( _docSnapShot.data() as dynamic)['userType'];
      print(userType);
      return await userType;
    } catch (e) {
      print(e);
    }
  }


  @override
  Widget build(BuildContext context) {
    final user = Provider.of<CustomUser?>(context);

    //return either Home or Authenticate widget
    if ( user == null) {
      print("this");
      return Authenticate();
    } else if (getUserType(user.uid) == "Patient") {
      print('this happens');
      return PatientHome();
    } else {
      print(getUserType(user.uid).toString() + "this thing");
      return PhysioHome();
    }
  }
}



의 반환 값이 이므로 콜백의 값에 액세스하거나 비동기 함수에서 값을 기다려야 합니다.

Flatter Widget에서 함수를 사용하기 때문에 빌드 메서드는 동기 함수여야 하므로 함수를 사용할 수 없습니다. 그러나 이 사용 사례에는 를 사용할 수 있습니다.

아래 예제 코드와 같은 Future Builder를 사용하도록 빌드 방법을 업데이트하십시오.

  @override
  Widget build(BuildContext context) {
    final user = Provider.of<CustomUser?>(context);
    if (user == null) {
     return Authenticate();
    } else {
    return FutureBuilder(
      future: getUserType(user.uid),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          final userType = snapshot.data;
          if (userType == 'Patient') {
            return PatientHome();
          } else {
            return PhysioHome();
          }
        } else {
            // A Widget to show while the value loads
            return Text('Loading'); 
        }
      }
    );
   }
  }

참고 항목:

이번 주의 설레는 위젯 - 미래 구축업체

Future Builder 문서


반응형