home_provide.dart 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import 'package:dio/dio.dart';
  2. import 'package:mvvm_flutter/model/repository.dart';
  3. import 'package:mvvm_flutter/view/base.dart';
  4. import 'package:rxdart/rxdart.dart';
  5. /// ViewModel 层
  6. ///
  7. /// 将 Model层 [GithubRepo] 返回的数据转换成 View 层 [HomePage] 需要展示的数据
  8. /// 通过 [notifyListeners] 通知UI层更新
  9. class HomeProvide extends BaseProvide {
  10. final GithubRepo _repo;
  11. String username = "";
  12. String password = "";
  13. bool _loading = false;
  14. /// 结果
  15. String _response = "";
  16. final String title;
  17. String get response => _response;
  18. set response(String response) {
  19. _response = response;
  20. notifyListeners();
  21. }
  22. bool get loading => _loading;
  23. double _btnWidth = 295.0;
  24. double get btnWidth => _btnWidth;
  25. set btnWidth(double btnWidth) {
  26. _btnWidth = btnWidth;
  27. notifyListeners();
  28. }
  29. set loading(bool loading) {
  30. _loading = loading;
  31. notifyListeners();
  32. }
  33. HomeProvide(this.title, this._repo);
  34. /// 登录
  35. ///
  36. /// 调用 model层[GithubRepo] 的 login 方法进行登录
  37. /// 传入 [username] 和 [password]
  38. /// 成功:显示返回的信息
  39. /// 失败: 处理错误,显示错误信息
  40. /// 订阅开始:loading = true
  41. /// 订阅结束:loading = false
  42. /// 返回 [Observable] 给 View 层
  43. Observable login() => _repo
  44. .login(username, password)
  45. .doOnData((r) => response = r.toString())
  46. .doOnError((e, stacktrace) {
  47. if (e is DioError) {
  48. response = e.response.data.toString();
  49. }
  50. })
  51. .doOnListen(() => loading = true)
  52. .doOnDone(() => loading = false);
  53. }