首页 > 解决方案 > 我似乎无法将 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 代码提示我使用创建,但我已经在使用传递令牌的更新,当我使用创建时,我收到一个错误,因为没有传递令牌。在这种情况下,如何在代理提供程序中同时使用创建和更新?

标签: flutter

解决方案


推荐阅读