0
点赞
收藏
分享

微信扫一扫

Flutter 状态管理机制--provider 封装使用

树下的老石头 2021-10-09 阅读 254

 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') })
举报

相关推荐

0 条评论