Commit 9524e4c1 authored by 窦文's avatar 窦文

view model?

parent 54d95d5c
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter/widgets.dart';
import 'package:netrain_flutter_app/douwen/custom/BaseView.dart';
import 'package:netrain_flutter_app/douwen/custom/BaseViewModel.dart';
class Demo2 extends BaseView {
Demo2() : super(BaseViewModel()) {
builder = (context, value, child) => Container(
child: Column(
children: [
Row(
children: [
_item("setNormal", () {
viewModel.setNormal();
}),
_item("setEmpty", () {
viewModel.setEmpty();
}),
_item("setError", () {
viewModel.setError();
}),
],
),
setReplaceView(Row(
children: [
ValueListenableBuilder(
valueListenable: viewModel.num,
builder: (context, value, child) =>
Text("点击了${viewModel.num.value}次")),
ElevatedButton(
onPressed: () {
viewModel.click();
},
child: Text("点击"))
],
)),
],
));
}
_item(String title, VoidCallback onPressed) {
return Container(
child: RaisedButton(
onPressed: onPressed,
child: Text(title),
),
);
}
}
import 'package:flutter/widgets.dart';
import 'package:netrain_flutter_app/douwen/custom/BaseViewModel.dart';
import 'package:provider/provider.dart';
import 'EmptyPage.dart';
import 'ErrorPage.dart';
import 'ViewState.dart';
class BaseView extends StatefulWidget {
BaseViewModel viewModel;
Widget Function(BuildContext context, BaseViewModel value, Widget child)
builder;
Widget _mReplaceView;
Widget emptyView = EmptyPage();
Widget errorView = ErrorPage();
BaseView(this.viewModel) {
}
Widget setReplaceView(Widget replaceView) {
_mReplaceView = replaceView;
switch (viewModel.viewState ?? ViewState.Normal) {
case ViewState.Normal:
return _mReplaceView;
case ViewState.Empty:
return emptyView;
case ViewState.Error:
return errorView;
case ViewState.Loading:
return _mReplaceView;
default:
return _mReplaceView;
}
}
@override
State<StatefulWidget> createState() {
return _BaseViewState();
}
}
class _BaseViewState extends State<BaseView> {
BaseViewModel viewModel;
@override
void initState() {
viewModel = widget.viewModel;
super.initState();
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (content) => viewModel,
child: Consumer<BaseViewModel>(
builder: widget.builder,
),
);
}
}
import 'package:flutter/widgets.dart';
import 'ViewState.dart';
class BaseViewModel with ChangeNotifier {
var _viewState;
var num = ValueNotifier<int>(0);
set viewState(ViewState viewState) => setViewState(viewState);
get viewState => _viewState;
void click() {
num.value = (num.value ?? 0) + 1;
num.notifyListeners();
}
void setNormal() {
viewState = ViewState.Normal;
}
void setEmpty() {
viewState = ViewState.Empty;
}
void setLoading() {
viewState = ViewState.Loading;
}
void setError() {
viewState = ViewState.Error;
}
setViewState(ViewState viewState) {
if (_viewState == viewState) {
return;
}
_viewState = viewState;
notifyListeners();
}
}
import 'package:flutter/widgets.dart';
class EmptyPage extends Container{
@override
Widget build(BuildContext context) {
return Center(
child: Container(
child: Text("This is EmptyView"),
),
);
}
}
\ No newline at end of file
import 'package:flutter/widgets.dart';
class ErrorPage extends Container{
@override
Widget build(BuildContext context) {
return Center(
child: Container(
child: Text("This is ErrorView"),
),
);
}
}
\ No newline at end of file
enum ViewState { Normal, Empty, Error, Loading }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:netrain_flutter_app/common/Images.dart'; import 'package:netrain_flutter_app/common/Images.dart';
import 'package:netrain_flutter_app/douwen/custom/BaseView.dart';
import 'package:netrain_flutter_app/douwen/custom/BaseViewModel.dart';
import 'Demo2.dart';
import 'secondpage.dart'; import 'secondpage.dart';
void main() { void main() {
...@@ -14,6 +17,8 @@ void main() { ...@@ -14,6 +17,8 @@ void main() {
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
// This widget is the root of your application. // This widget is the root of your application.
BaseViewModel viewModel = BaseViewModel();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return WillPopScope( return WillPopScope(
...@@ -26,12 +31,14 @@ class MyApp extends StatelessWidget { ...@@ -26,12 +31,14 @@ class MyApp extends StatelessWidget {
), ),
initialRoute: "key1", initialRoute: "key1",
routes: <String, WidgetBuilder>{ routes: <String, WidgetBuilder>{
"key1": (context) => Scaffold( "key1": (context) =>
appBar: AppBar( Scaffold(
title: Text("路由"), body: Scaffold(
), appBar: AppBar(
body: RouterNavigator(title: 'Flutter Demo Home Page'), title: Text("这个是标题"),
), ),
body:Demo2(),
)),
"key2": (context) => Second() "key2": (context) => Second()
}, },
), ),
...@@ -40,33 +47,6 @@ class MyApp extends StatelessWidget { ...@@ -40,33 +47,6 @@ class MyApp extends StatelessWidget {
return true; return true;
}); });
} }
}
class RouterNavigator extends StatefulWidget {
RouterNavigator({Key key, this.title}) : super(key: key);
final String title;
@override
_RouterNavigatorState createState() => _RouterNavigatorState();
}
class _RouterNavigatorState extends State<RouterNavigator> {
bool byName = false;
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: [
_item("跳转", () async {
var result = await Navigator.push(context, MaterialPageRoute(builder: (context) => Second()));
print("返回值:$result");
}),
Image.asset(Images.bg_my_01)
],
),
);
}
_item(String title, VoidCallback onPressed) { _item(String title, VoidCallback onPressed) {
return Container( return Container(
......
...@@ -43,6 +43,7 @@ dependencies: ...@@ -43,6 +43,7 @@ dependencies:
convert: ^3.0.1 #转码器 convert: ^3.0.1 #转码器
pull_to_refresh: ^2.0.0 pull_to_refresh: ^2.0.0
shared_preferences: ^2.0.6 shared_preferences: ^2.0.6
provider: ^4.1.0
dev_dependencies: dev_dependencies:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment