flutter - 我似乎无法将 auth.dart 文件中的令牌传递给我的 Provider 类
问题描述
这是我的 main.dart 文件:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (ctx) => Auth(),
),
ChangeNotifierProxyProvider<Auth, Transactions>(
update: (ctx, auth, previousTransactions) => Transactions(
auth.token,
previousTransactions == null
? []
: previousTransactions.userTransactions),
),
],
这是我的 Auth.dart 文件:
class Auth with ChangeNotifier {
String _token;
DateTime _expiryDate;
String _userId;
bool get isAuth {
return token != null;
}
String get token {
if (_expiryDate != null &&
_expiryDate.isAfter(DateTime.now()) &&
_token != null) {
return _token;
}
return null;
}
Future<void> signUp(String username, String password) async {
const url =
'https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=APIKEY';
try {
final response = await http.post(
url,
body: json.encode(
{
'email': username,
'password': password,
'returnSecureToken': true,
},
),
);
final responseData = jsonDecode(response.body);
if (responseData['error'] != null) {
throw HttpException(responseData['error']['message']);
}
} catch (error) {
throw error;
}
}
Future<void> logIn(String username, String password) async {
const url =
'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=APIKEY';
try {
final response = await http.post(
url,
body: json.encode(
{
'email': username,
'password': password,
'returnSecureToken': true,
},
),
);
final responseData = jsonDecode(response.body);
if (responseData['error'] != null) {
throw HttpException(responseData['error']['message']);
}
_token = responseData['idToken'];
_userId = responseData['localId'];
_expiryDate = DateTime.now().add(
Duration(
seconds: int.parse(responseData['expiresIn']),
),
);
notifyListeners();
} catch (error) {
throw error;
}
}
}
这是我接受令牌的 Provider 类:
class Transactions with ChangeNotifier {
List<Transaction> _userTransactions = [
];
final String authToken;
Transactions(this.authToken, this._userTransactions);
ProxyProvider 代码提示我使用创建,但我已经在使用传递令牌的更新,当我使用创建时,我收到一个错误,因为没有传递令牌。在这种情况下,如何在代理提供程序中同时使用创建和更新?
解决方案
推荐阅读
- azure - 用于在资源组参与者中自动添加用户组的 Azure 策略
- javascript - 周开始数组 javascript 直到 X 天
- node.js - 如何引用节点模块中包含的 nunjucks 模板?
- javascript - 如何为 Promise.resolve().then() 使用异步替代方案?
- ruby-on-rails - Ruby - 有没有办法获取特定未来时间的时间戳,但取决于时区
- ios - Swift 编程约束不起作用
- rippled - 涟漪中的组件如何发送和接收来自对等点的消息?
- java - 为什么在这个基本的 Spring 应用程序中没有调用函数?
- android - TextView Drawable 兼容返回 null
- swift - SwiftUI:如何根据 Picker 的值更新 ForEach 循环的范围