Flutter MVC架构插件packagist_mvc的使用
Flutter MVC架构插件packagist_mvc的使用
MVC基础框架
示例代码地址
Getting Started
Model Class
Model
是 MVC 模式中的数据层,用于存储和管理应用的数据。
class MvcModel extends BaseModel {
}
Controller Class
Controller
是 MVC 模式的控制层,负责处理业务逻辑和状态管理。
class MvcController extends BaseController<MvcModel> {
[@override](/user/override)
MvcModel model = MvcModel();
// 扩展功能
extension Data on MvcController {}
extension Action on MvcController {}
extension Network on MvcController {}
}
View Class
View
是 MVC 模式的视图层,负责展示 UI 并响应用户交互。
class MvcPage extends BasePage<MvcController, MvcModel> {
const MvcPage({super.key});
[@override](/user/override)
MvcController putController() => Get.put(MvcController());
[@override](/user/override)
String? get tag => null;
[@override](/user/override)
Color get backgroundColor => Colors.white;
[@override](/user/override)
Widget? get appBar => AppBar(
title: const Text('Title'),
);
[@override](/user/override)
Widget get body {
return Center();
}
}
TabController 初始化
View Class
TabController
用于管理多标签页的状态。
class MvcPage extends BasePage<MvcController, MvcModel> {
[@override](/user/override)
Widget get body {
return Column(children: [
TabBar(
controller: model.tabController,
onTap: (int index) {
model.tabController.animateTo(index);
},
tabs: const [
Tab(text: 'Tab1'),
Tab(text: 'Tab2'),
],
labelColor: Colors.black,
),
Expanded(
child: TabBarView(
controller: model.tabController,
children: const [
MvcTab1Page(),
MvcTab2Page(),
],
),
),
]);
}
[@override](/user/override)
State<BasePage> createState() => TabControllerState<MvcPage, MvcController>();
[@override](/user/override)
void initTabController(TickerProvider vsync) {
model.tabController = TabController(length: 2, vsync: vsync);
}
}
KeepAlive
通过 KeepAlive
保持页面状态。
View Class
class MvcPage extends BasePage<MvcController, MvcModel> {
[@override](/user/override)
State<BasePage> createState() =>
KeepAliveState<MvcTab2Page, MvcTab2Controller>();
}
View Status Switch
Controller Class
实现加载状态的动态切换。
class MvcController extends BaseStatusController<MvcModel> {
[@override](/user/override)
MvcModel model = MvcModel();
[@override](/user/override)
void onReady() {
super.onReady();
toContent(); // 初始状态为内容显示
}
[@override](/user/override)
void onRetry() {
onStatusSwitch();
}
}
extension Action on MvcController {
void onStatusSwitch() {
model.count++; // 计数器增加
if (model.count % 5 == 0) {
toLoading(); // 进入加载状态
Future.delayed(const Duration(seconds: 2), () => toContent()); // 延迟后恢复内容状态
} else if (model.count % 2 == 0) {
toLoading();
Future.delayed(const Duration(seconds: 2), () => toEmpty()); // 延迟后进入空状态
} else {
toLoading();
Future.delayed(const Duration(seconds: 2), () => toError()); // 延迟后进入错误状态
}
}
}
View Class
实现不同状态的 UI 展示。
class MvcPage extends BaseStatusPage<MvcController, MvcModel> {
const MvcPage({super.key});
[@override](/user/override)
MvcController putController() => Get.put(MvcController());
[@override](/user/override)
Widget get loading => super.loading; // 默认加载状态
[@override](/user/override)
Widget get error => GestureDetector(
onTap: controller.onRetry, // 点击重试
child: super.error,
);
[@override](/user/override)
Widget get empty => GestureDetector(
onTap: controller.onRetry, // 点击重试
child: super.empty,
);
[@override](/user/override)
Widget get body {
return Center(
child: TextButton(
onPressed: controller.onStatusSwitch, // 点击切换状态
child: const Text('MVC加载状态切换测试,\n点击进入加载状态'),
),
);
}
}
完整示例 Demo
以下是一个完整的示例代码,展示如何使用 packagist_mvc
插件构建一个带有状态切换的 MVC 架构页面。
// main.dart
import 'package:flutter/material.dart';
import 'package:packagist_mvc/base/lifecycle_observer.dart';
import 'mvc_page.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
navigatorObservers: [lifecycleObserver],
title: 'Flutter MVC Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MvcPage(),
);
}
}
更多关于Flutter MVC架构插件packagist_mvc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter MVC架构插件packagist_mvc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
packagist_mvc
是一个用于 Flutter 的 MVC 架构插件,它帮助开发者更容易地组织和维护 Flutter 应用程序的代码。MVC(Model-View-Controller)是一种设计模式,它将应用程序的逻辑分为三个部分:模型(Model)、视图(View)和控制器(Controller)。使用 packagist_mvc
,你可以更清晰地分离业务逻辑、UI 和数据管理。
安装 packagist_mvc
首先,你需要在 pubspec.yaml
文件中添加 packagist_mvc
依赖:
dependencies:
flutter:
sdk: flutter
packagist_mvc: ^1.0.0 # 使用最新版本
然后运行 flutter pub get
来安装依赖。
使用 packagist_mvc
1. 创建模型(Model)
模型负责管理应用程序的数据和业务逻辑。你可以创建一个类来表示模型。
class UserModel {
String name;
int age;
UserModel({required this.name, required this.age});
}
2. 创建控制器(Controller)
控制器负责处理用户输入并更新模型。你可以创建一个控制器类来管理模型的更新和业务逻辑。
import 'package:packagist_mvc/packagist_mvc.dart';
class UserController extends Controller {
UserModel _user = UserModel(name: 'John', age: 25);
UserModel get user => _user;
void updateUser(String name, int age) {
_user = UserModel(name: name, age: age);
notifyListeners(); // 通知视图更新
}
}
3. 创建视图(View)
视图负责展示数据并处理用户交互。你可以使用 Consumer
来监听控制器的变化并更新 UI。
import 'package:flutter/material.dart';
import 'package:packagist_mvc/packagist_mvc.dart';
import 'user_controller.dart';
class UserView extends StatelessWidget {
final UserController controller = UserController();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('User Profile'),
),
body: Center(
child: Consumer<UserController>(
builder: (context, controller, child) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Name: ${controller.user.name}'),
Text('Age: ${controller.user.age}'),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
controller.updateUser('Jane', 30);
},
child: Text('Update User'),
),
],
);
},
),
),
);
}
}
4. 在应用程序中使用 MVC
最后,你可以在应用程序的主入口中使用 UserView
来启动应用。
import 'package:flutter/material.dart';
import 'user_view.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter MVC Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: UserView(),
);
}
}