flutter_mvc 1.0.0+1
flutter_mvc: ^1.0.0+1 copied to clipboard
A state management framework that focuses on the separation of UI and logic.
Flutter Mvc #
Flutter Mvc 是为了解决UI与逻辑分离的一个状态管理框架。 完整文档请阅读此处
Getting started #
分别创建Model,MvcView<TModelType,TControllerType>,MvcController<TModelType>
/// Model
class IndexPageModel {
IndexPageModel({required this.title});
final String title;
}
/// Controller
class IndexPageController extends MvcController<IndexPageModel> {
@override
MvcView view(IndexPageModel model) {
return IndexPage();
}
}
/// View
class IndexPage extends MvcView<IndexPageController, IndexPageModel> {
@override
Widget buildView(context) {
//...
}
}
然后使用Mvc
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Mvc<IndexPageController, IndexPageModel>(
create: () => IndexPageController(),
model: IndexPageModel(title: "Flutter Mvc Demo"),
),
);
}
}
状态管理 #
首先在Controller的init方法中初始化状态
class IndexPageController extends MvcController<IndexPageModel> {
@override
void init() {
super.init();
initState<int>(0);
}
}
在View中使用状态
Widget buildView(context) {
return MvcStateScope<IndexPageController>(
(state) {
return Text("${state.get<int>()}");
},
);
}
在Controller中更新状态
updateState<int>(updater: ((state) => state.value++));
在更新状态时如果MvcStateScope
曾获取过该状态,则MvcStateScope
将会重建。如果在MvcStateScope
区域中使用的多个状态,则任意状态发生更新这个MvcStateScope
都会重建。
完整样例 #
import 'package:flutter/material.dart';
import 'package:flutter_mvc/flutter_mvc.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Mvc<IndexPageController, IndexPageModel>(
create: () => IndexPageController(),
model: IndexPageModel(title: "Flutter Demo"),
),
);
}
}
/// Model
class IndexPageModel {
IndexPageModel({required this.title});
final String title;
}
/// View
class IndexPage extends MvcView<IndexPageController, IndexPageModel> {
@override
Widget buildView(ctx) {
return Scaffold(
appBar: AppBar(
title: Text(ctx.model.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
MvcStateScope<IndexPageController>(
(state) {
return Text("${state.get<int>()}");
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: ctx.controller.incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
/// Controller
class IndexPageController extends MvcController<IndexPageModel> {
@override
void init() {
super.init();
initState<int>(0); // 初始化状态
}
void incrementCounter() {
updateState<int>(updater: ((state) => state?.value++)); // 更新状态
}
@override
MvcView view(model) {
return IndexPage();
}
}