使用提供商登录

时间:2019-07-07 15:39:30

标签: flutter dart

我正在尝试使用提供者模式创建登录名。这是我到目前为止尝试过的...

首先这是我的UserRepository:

enum Status { Uninitialized, Authenticated, Authenticating, Unauthenticated }
class UserRepository with ChangeNotifier{
  User user;
  Status _status =Status.Uninitialized;

  Status get status => _status;
  User get authUser => user;

  Future<bool> signIn(String email, String password) async {
    try{
    var body = jsonEncode({
      'email': email,
      'password': password
    });

    var res = await http.post(('http://192.168.178.35:8000/auth/login'),
        body: body,
        headers: {
          "Accept": "application/json",
          "content-type": "application/json"
        });
    var response = jsonDecode(res.body);

    if(response.status == 200)
    {
      notifyListeners();
      return true;
    }
    }
    catch(e)
    {
      _status = Status.Unauthenticated;
      notifyListeners();
      return false;
    }
  }
}

这应该是我的输入页面(主页):

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<UserRepository>(     
    child: Consumer(
        builder: (context, UserRepository user, _) {
          switch (user.status) {
            case Status.Uninitialized:
              return Login();
            case Status.Unauthenticated:
            case Status.Authenticating:
              return Login();
            case Status.Authenticated:
              return DriverDashboard(user: user.user);
          }
        },
      ),
    );
  }
}

当我尝试运行该应用程序后,出现此错误:

enter image description here

有人知道为什么会这样吗?这是实现ChangeNotifierProvider的正确方法吗?

我正在尝试遵循本教程https://medium.com/flutter-community/flutter-firebase-login-using-provider-package-54ee4e5083c7 ...

但是,除了Firebase之外,我使用自定义创建的RESTful API作为后端。

1 个答案:

答案 0 :(得分:1)

尽管此错误消息不直观,但我想您可能会在null函数中返回builder

    class HomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return ChangeNotifierProvider<UserRepository>(     
        child: Consumer(
            builder: (context, UserRepository user, _) {
              //NOTICE HERE: What If your user is null?
              switch (user.status) {
                case Status.Uninitialized:
                  return Login();
                case Status.Unauthenticated:
                case Status.Authenticating:
                  return Login();
                case Status.Authenticated:
                  return DriverDashboard(user: user.user);
              }
              // return SplashPageHere();
            },
          ),
        );
      }
    }

您应该提供一个初始页面,或为构建器返回Widget的内容。

编辑: 这是使用ChangeNotifierProvider

的示例
    ChangeNotifierProvider<AppState>(
              builder: (_) => AppState(),
              child: MyHomePage(),
            ));

这是您从媒介发布的代码:

      @override
      Widget build(BuildContext context) {
        return ChangeNotifierProvider(
          builder: (_) => UserRepository.instance(),
          child: Consumer(
            builder: (context, UserRepository user, _) {
              switch (user.status) {
                case Status.Uninitialized:
                  return Splash();
                case Status.Unauthenticated:
                case Status.Authenticating:
                  return LoginPage();
                case Status.Authenticated:
                  return UserInfoPage(user: user.user);
              }
            },
          ),
        );
      }

ChangeNotifierProvider应包含一个builderchild,这就是为什么您的用户始终拥有null的原因...

相关问题