微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在颤振中使用 changeNotifier 与 provider

如何解决如何在颤振中使用 changeNotifier 与 provider

我正在为我的项目使用提供程序包。我使用 ChangeNotifier 在我的 Auth 模型中创建了两个函数。第一个是身份验证,第二个是 tryAutoLogin。如果我调用 tryAutoLogin 函数,那么 getter 会获取类似 userCode 的值,获取我在函数中分配给 code 变量的值,就像其他 getter 一样。但是 authentication 没有得到值。你能告诉我我做错了什么吗。

import 'dart:convert';

import 'package:Flutter/cupertino.dart';
import 'package:neighbourhood_watch/models/http_Exception.dart';
import 'package:neighbourhood_watch/models/user.dart';
import 'package:neighbourhood_watch/api.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Auth with ChangeNotifier {
  int _code;
  List<UserElement> _user;
  String _message;
  String _token;
  bool get isAuth {
    return token != null;
  }

  int get userCode {
    if (_code != null) return _code;
    return null;
  }

  String get userApiMessage {
    if (_message != null) return _message;
    return null;
  }

  UserElement get apiUser {
    if (_user != null) {
      print('This is the Getter of the User ${_user.first.token}');
      return _user.first;
    }
    return null;
  }

  String get token {
    if (_token != null) {
      return _token;
    }
    return null;
  }

  Future<void> authenticate(String email,String password) async {
    User responseData = await UserApi().apiLoginPost(email,password);
    if (responseData.code != 200) {
      _code = responseData.code;
      _message = responseData.message;
      throw HttpException(responseData.message);
    }

    SharedPreferences pref = await SharedPreferences.getInstance();
    final userData = json.encode({
      'email': email,'password': password,});
    //Save the User Inforamtion in the Shared Preferences
    pref.setString('userData',userData);
    print('This is the first reponse Data ${responseData.user[0].token}');
    _code = responseData.code;
    print('Response Code $_code}');

    _message = responseData.message;
    print('Response Message $_message');
    _user = responseData.user;
    print('Response User ${_user.first.token}');
    print('This call from function authehicate ${_user.first.token}');
    notifyListeners();
  }

  Future<bool> tryAutoLogIn() async {
    final prefs = await SharedPreferences.getInstance();
    final extractedUserData =
        json.decode(prefs.getString('userData')) as Map<String,Object>;
    if (!prefs.containsKey('userData')) {
      return false;
    }

    if (prefs.containsKey('userData')) {
      print('This is the user Token ${extractedUserData['email']}');
      print('This is the fcm Token ${extractedUserData['password']}');
      User responsData2 = await UserApi().apiLoginPost(
          extractedUserData['email'],extractedUserData['password']);
      _token = extractedUserData['email'];
      _code = responsData2.code;
      _message = responsData2.message;
      _user = responsData2.user;
      notifyListeners();
      return true;
    }
    notifyListeners();
    print(_token);
    return true;
  }
}

解决方法

你只需要调用“notifyListeners();”在方法结束时

,

问题是因为我像 Auth().authenticate() 一样访问它,但必须像 Provider.of<Auth>(context).authenticate(); 一样使用它

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。