Flutter 基础mvvm

87 阅读1分钟
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'base_model.dart';

class BaseView<T extends BaseModel> extends StatefulWidget {
  final Widget Function(BuildContext context, T model, Widget? child) builder;

  final T model;
  final Function(T) onModelReady;
  final Widget? child;

  const BaseView({
    Key? key,
    required this.model,
    required this.onModelReady,
    required this.builder,
    this.child,
  }) : super(key: key);

  _BaseViewState<T> createState() => _BaseViewState<T>();
}

class _BaseViewState<T extends BaseModel> extends State<BaseView<T>> {
  late T model;

  @override
  void initState() {
    model = widget.model;
    widget.onModelReady(model);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<T>(
      child: Consumer<T>(
        builder: widget.builder,
        child: widget.child,
      ),
      create: (BuildContext context) {
        return model;
      },
    );
  }
}
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_app/net/net_api.dart';

abstract class BaseModel<T> extends ChangeNotifier {
  bool disposed = false;

  BaseModel();

  ViewState _state = ViewState.Idle;

  ViewState get state => _state;

  List<StreamSubscription> streamSub = [];

  void addStreamSub(StreamSubscription streamSubscription) {
    streamSub.add(streamSubscription);
  }

  void setState(ViewState viewState) {
    _state = viewState;
    notifyListeners();
  }

  @override
  void dispose() {
    super.dispose();
    disposed = true;
    for (int i = 0; i < streamSub.length; i++) {
      if (streamSub[i] != null) {
        streamSub[i].cancel();
      }
    }
    streamSub.clear();
  }

  void notifyListeners() {
    if (!disposed) {
      super.notifyListeners();
    }
  }
}

enum ViewState { Idle, Busy }