
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
 enum ViewState { Loading, Success, Failure, None }
 class BaseModel extends ChangeNotifier {
ViewState _state = ViewState.None;
ViewState get state => _state;
void setState(ViewState viewState) {
_state = viewState;
notifyListeners();
}
}
class BaseWidget<T extends ChangeNotifier> extends StatefulWidget {
 final Widget Function(BuildContext context, T model, Widget child) builder;
 final T model;
 final Widget child;
 final Function(T) onModelReady;
BaseWidget({
Key key,
this.builder,
this.model,
this.child,
this.onModelReady,
}) : super(key: key);
_BaseWidgetState<T> createState() => _BaseWidgetState<T>();
}
class _BaseWidgetState<T extends ChangeNotifier> extends      State<BaseWidget<T>> {
T model;
@override
void initState() {
model = widget.model;
if (widget.onModelReady != null) {
  widget.onModelReady(model);
}
super.initState();
}
@override
 Widget build(BuildContext context) {
 return ChangeNotifierProvider<T>(
  create: (BuildContext context) => model,
  child: Consumer<T>(
    builder: widget.builder,
    child: widget.child,
  ),
);
}
}
/// viewModel
class SpareDetailModel extends BaseModel {
SpareDetailServive _detailServive;
String info = '请登录';
bool show = false;
 SpareDetailModel({@required SpareDetailServive detailServive})
  : _detailServive = detailServive;
 // ignore: missing_return
 Future<String> login(String pwd) async {
setState(ViewState.Loading);
info = await _detailServive.login(pwd);
setState(ViewState.Success);
}
 // ignore: missing_return
 Future<bool> rowShow(int index) async {
if (index == 0) {
  show = true;
} else {
  show = false;
}
setState(ViewState.Success);
}
}
/// api
class SpareDetailServive {
static const String Login_path = 'xxxxxx';
 Future<String> login(String pwd) async {
return new Future.delayed(const Duration(seconds: 1), () => "登录成功");
 }
}
BaseWidget<SpareDetailModel>(
    model: SpareDetailModel(detailServive: SpareDetailServive()),
    builder: (context, model, child) => GestureDetector(
                              onTap: () { model.login(pwd),print('model.info') })