base.dart 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import 'dart:async';
  2. import 'package:dartin/dartin.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:provider/provider.dart';
  5. import 'package:rxdart/rxdart.dart';
  6. /// normal click event
  7. abstract class Presenter {
  8. /// 处理点击事件
  9. ///
  10. /// 可根据 [action] 进行区分 ,[action] 应是不可变的量
  11. void onClick(String action);
  12. }
  13. /// ListView Item Click
  14. abstract class ItemPresenter<T> {
  15. /// 处理列表点击事件
  16. ///
  17. /// 可根据 [action] 进行区分 ,[action] 应是不可变的量
  18. void onItemClick(String action, T item);
  19. }
  20. /// BaseProvide
  21. class BaseProvide with ChangeNotifier {
  22. CompositeSubscription compositeSubscription = CompositeSubscription();
  23. /// add [StreamSubscription] to [compositeSubscription]
  24. ///
  25. /// 在 [dispose]的时候能进行取消
  26. addSubscription(StreamSubscription subscription) {
  27. compositeSubscription.add(subscription);
  28. }
  29. @override
  30. void dispose() {
  31. if (!compositeSubscription.isDisposed) {
  32. compositeSubscription.dispose();
  33. }
  34. super.dispose();
  35. }
  36. }
  37. /// page的基类 [PageProvideNode]
  38. ///
  39. /// 隐藏了 [Provider] 的调用
  40. abstract class PageProvideNode<T extends ChangeNotifier> extends StatelessWidget implements Presenter {
  41. final T mProvider;
  42. /// 构造函数
  43. ///
  44. /// [params] 代表注入ViewModel[mProvider]时所需的参数,需按照[mProvider]的构造方法顺序赋值
  45. PageProvideNode({List<dynamic> params}) : mProvider = inject<T>(params: params);
  46. Widget buildContent(BuildContext context);
  47. @override
  48. Widget build(BuildContext context) {
  49. return ChangeNotifierProvider<T>.value(
  50. value: mProvider,
  51. child: buildContent(context),
  52. );
  53. }
  54. ///点击事件处理
  55. ///
  56. /// 可通过[action]进行分发
  57. @override
  58. void onClick(String action) {}
  59. }