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

1 回复

更多关于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(),
    );
  }
}
回到顶部