#flutter #merge #package #future #provider
#флаттер #слияние #пакет #будущее #поставщик
Вопрос:
Я обновил свой pubspec.yaml, и он показывает мне некоторую ошибку. Как я могу это решить?
Ошибки:
- Значение типа ‘User’ не может быть возвращено из функции ‘getUser’, поскольку оно имеет возвращаемый тип ‘Future’.
- ожидается 1 позиционный аргумент (ы), но найдено 0. Попробуйте добавить недостающие аргументы.
- Именованный параметр ‘providerId’ не определен. Попробуйте исправить имя на имя существующего именованного параметра или определить именованный параметр с именем ‘providerId’.
- Именованный параметр ‘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),
);