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
if (streamSub[i] != null) {
streamSub[i].cancel()
}
}
streamSub.clear()
}
void notifyListeners() {
if (!disposed) {
super.notifyListeners()
}
}
}
enum ViewState { Idle, Busy }