首页 > 解决方案 > 使用提供者登录

问题描述

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

首先这是我的 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);
          }
        },
      ),
    );
  }
}

在我尝试运行该应用程序后,我收到此错误:

在此处输入图像描述

有谁知道为什么会这样?这是如何实施的正确方法ChangeNotifierProvider吗?

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

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

标签: flutterdart

解决方案


虽然,这个错误信息并不直观,但我猜你可能会nullbuilder函数中返回 a。

    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应该包含一个builderand child,这就是为什么你总是null为你的用户...


推荐阅读