用户登录

验证用户身份之前用的是我们定义的一个 model,下面我们可以改造一下,用一个 Store 替换这个 Model。

在项目里先创建一个文件,放在 lib/auth 的下面,名字是 auth_store.dart,在文件里定义一个 store,包含的文件是 auth_store.g.dart,名字叫 AuthStore。在构造方法里执行一下 initReactions() 初始化一下 Store 里的反应,等会儿我们会添加一个反应。

在 store 的数据里添加一个 bool 类型的数据,名字是 loading,默认值是 false。 下面再添加一个数据,类型是 Auth? 名字是 auth。之前在 auth_model 里,有 userId,token 这些数据,这里我们只定义一个 auth 数据,它里面有验证身份成功以后得到的 token 还有 userId 之类的数据。

在计算属性里添加一个计算属性,返回的是 bool ,名字是 isLoggedIn ,值可以判断 auth != null。 如果 auth 不等于 null,暂时我们就认为用户当前已经登录了。

再定义几个动作,一个是 setLoading,参数类型是 bool ,设置 loading 让它等于 data。 下面再定义一个动作,名字是 setAuth,接收的参数是可选的,类型是 Auth? 名字是 data,也就是使用 setAuth 的时候可以不提供 data 参数的值。设置 auth ,让它等于 data 。

这里我们为了通知依赖这个 Store 的 Provider ,可以执行一下 notifyListeners() ,要使用这个方法需要处理一下这个类,用一个 mixin,名字是 ChangeNotifier。

再定义一个方法,名字是 logout,在这个方法里,执行一下 setAuth,不提供参数值。

login

然后定义一个请求登录用的方法,返回的类型是 Future 名字是 login,参数类型是 LoginData 名字是 data,请求的地址是接口基本的地址,然后 /login 。

下面可以导入需要的这个 AppConfig,jsonDecode,还有这个 HttpException。

发送请求用的方法,可以用一下 http.post,请求的地址是上面准备好的 uri,带的数据交给 body 参数,值是 data.toJson() 。

在文件顶部,可以导入一个包,导入的是 http 这个包。起个名字叫 http。

请求成功以后声明一个 auth,用一下 Auth.fromJson,把 responseBody 交给它,下面执行 setAuth,把 auth 交给这个动作。最后返回的是这个 auth。

反应

下面再定义一个反应,名字是 storeOrRemoveAuth ,在这个 store 里,如果 auth 这个数据有变化,可以用这个反应来处理一下。检查的是 auth 这个数据,做出的反应这里,可以判断一下 auth 是否等于 null,如果是,执行 AppStorage.remove,删除掉存储的 auth 这个名字的数据。

else,不等于 null 的话,可以执行 AppStorage.setObject,存储的数据的名字是 auth,值是 auth!.toJson() 。

在 initReactions 里面,用一下 reactionDisposers.add ,把执行 storeOrRemoveAuth 返回的结果交给这个 add 方法。

Provider

下面再创建一个 Provider 给小部件提供这个 Store ,打开 auth_provider ,声明一个 authStoreProvider,新建一个 ChangeNotifierProvider.value,value 的值可以新建一个 AuthStore() 。然后在 authProviders 里面,添加一个 authStoreProvider 。

定义身份验证 Store(AuthStore)《 Flutter 移动端实例:修复改进 》

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点