Обновление пакетов Flutter создает проблему

#flutter #merge #package #future #provider

#флаттер #слияние #пакет #будущее #поставщик

Вопрос:

Я обновил свой pubspec.yaml, и он показывает мне некоторую ошибку. Как я могу это решить?

Ошибки:

  1. Значение типа ‘User’ не может быть возвращено из функции ‘getUser’, поскольку оно имеет возвращаемый тип ‘Future’.
  2. ожидается 1 позиционный аргумент (ы), но найдено 0. Попробуйте добавить недостающие аргументы.
  3. Именованный параметр ‘providerId’ не определен. Попробуйте исправить имя на имя существующего именованного параметра или определить именованный параметр с именем ‘providerId’.
  4. Именованный параметр ‘merge’ не определен. Попробуйте исправить имя на имя существующего именованного параметра или определить именованный параметр с именем ‘merge’.

Вот мой код —

 import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:apple_sign_in/apple_sign_in.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:async';

class AuthService {
  final GoogleSignIn _googleSignIn = GoogleSignIn();
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final FirebaseFirestore _db = FirebaseFirestore.instance;

  // Firebase user one-time fetch
  Future<User> get getUser => _auth.currentUser;

  // Firebase user a realtime stream
  Stream<User> get user => _auth.authStateChanges();

  // Determine if Apple Signin is available on device
  Future<bool> get appleSignInAvailable => AppleSignIn.isAvailable();

  /// Sign in with Apple
  Future<User> appleSignIn() async {
    try {
      final AuthorizationResult appleResult =
          await AppleSignIn.performRequests([
        AppleIdRequest(requestedScopes: [Scope.email, Scope.fullName])
      ]);

      if (appleResult.error != null) {
        // handle errors from Apple
      }

      final AuthCredential credential =
          OAuthProvider(providerId: 'apple.com').credential(
        accessToken:
            String.fromCharCodes(appleResult.credential.authorizationCode),
        idToken: String.fromCharCodes(appleResult.credential.identityToken),
      );

      UserCredential firebaseResult =
          await _auth.signInWithCredential(credential);
      User user = firebaseResult.user;

      // Update user data
      updateUserData(user);

      return user;
    } catch (error) {
      print(error);
      return null;
    }
  }

  /// Sign in with Google
  Future<User> googleSignIn() async {
    try {
      GoogleSignInAccount googleSignInAccount = await _googleSignIn.signIn();
      GoogleSignInAuthentication googleAuth =
          await googleSignInAccount.authentication;

      final AuthCredential credential = GoogleAuthProvider.credential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.idToken,
      );

      UserCredential result = await _auth.signInWithCredential(credential);
      User user = result.user;

      // Update user data
      updateUserData(user);

      return user;
    } catch (error) {
      print(error);
      return null;
    }
  }

  /// Anonymous Firebase login
  Future<User> anonLogin() async {
    UserCredential result = await _auth.signInAnonymously();
    User user = result.user;

    updateUserData(user);
    return user;
  }

  /// Updates the User's data in Firestore on each new login
  Future<void> updateUserData(User user) {
    DocumentReference reportRef = _db.collection('reports').doc(user.uid);

    return reportRef
        .set({'uid': user.uid, 'lastActivity': DateTime.now()}, merge: true);
  }

  // Sign out
  Future<void> signOut() {
    return _auth.signOut();
  }
}
  

введите описание изображения здесь

Вот pubspec.yaml —

 name: quizapp
description: Realtime Quiz app built with Flutter amp; Firebase

version: 1.4.0

environment:
  sdk: ">=2.7.0 <3.0.0"


dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2

  firebase_core: ^0.5.1
  firebase_analytics: ^6.1.0

  cloud_firestore: ^0.14.2

  firebase_auth: ^0.18.2
  google_sign_in: ^4.5.6
  apple_sign_in: ^0.1.0

  rxdart: ^0.24.1
  provider: ^4.3.2 2
  font_awesome_flutter: 8.8.1

dev_dependencies:
  flutter_test:
    sdk: flutter






flutter:
  assets:
    - assets/
    - assets/covers/
    - assets/congrats.gif
    

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  # assets:
  #  - images/a_dot_burr.jpeg
  #  - images/a_dot_ham.jpeg

  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.dev/assets-and-images/#resolution-aware.

  # For details regarding adding assets from package dependencies, see
  # https://flutter.dev/assets-and-images/#from-packages

  # To add custom fonts to your application, add a fonts section here,
  # in this "flutter" section. Each entry in this list should have a
  # "family" key with the font family name, and a "fonts" key with a
  # list giving the asset and other descriptors for the font. For
  # example:
  # fonts:
  #   - family: Schyler
  #     fonts:
  #       - asset: fonts/Schyler-Regular.ttf
  #       - asset: fonts/Schyler-Italic.ttf
  #         style: italic
  #   - family: Trajan Pro
  #     fonts:
  #       - asset: fonts/TrajanPro.ttf
  #       - asset: fonts/TrajanPro_Bold.ttf
  #         weight: 700
  #
  # For details regarding fonts from package dependencies,
  # see https://flutter.dev/custom-fonts/#from-packages
  

Пожалуйста, кто-нибудь, помогите мне сохранить это.

Ответ №1:

Замените свой код этим.

  get getUser => _auth.currentUser;
  

и

  final AuthCredential credential =
  OAuthProvider('apple.com').credential(
    accessToken:
    String.fromCharCodes(appleResult.credential.authorizationCode),
    idToken: String.fromCharCodes(appleResult.credential.identityToken),
  );
  

также

  Future<void> updateUserData(User user) {
    DocumentReference reportRef = _db.collection('reports').doc(user.uid);
    return reportRef
        .set({'uid': user.uid, 'lastActivity': DateTime.now()}, SetOptions(merge: true) );
  }
  

Комментарии:

1. как насчет (именованный параметр ‘merge’ не определен. Попробуйте исправить имя на имя существующего именованного параметра или определить именованный параметр с именем ‘merge’. )

2. позвольте мне проверить один раз. можете ли вы вставить все свои зависимости

Ответ №2:

Если ваш код работал раньше, переключитесь на безопасный канал flutter. Здесь вы найдете множество инструкций при поиске безопасного канала

Ответ №3:

Замените ваш код этим:

1.

   Future<User> get getUser => _auth.currentUser;
  

на

 Future<User> get getUser => await _auth.currentUser;
  
  final AuthCredential credential =
      OAuthProvider(providerId: 'apple.com').credential(
    accessToken:
        String.fromCharCodes(appleResult.credential.authorizationCode),
    idToken: String.fromCharCodes(appleResult.credential.identityToken),
  );
  

на

 final AuthCredential credential =
      OAuthProvider(providerId: 'apple.com').getCredential(
    accessToken:
        String.fromCharCodes(appleResult.credential.authorizationCode),
    idToken: String.fromCharCodes(appleResult.credential.identityToken),
  );