当前位置: 首页 > article >正文

【FlutterDart】MVVM(Model-View-ViewModel)架构模式例子-http版本(30 /100)

动图更精彩

在这里插入图片描述

MVVM(Model-View-ViewModel)

特点
Model:负责数据管理和业务逻辑。
View:负责显示数据,通常是一个UI组件。
ViewModel:负责处理用户交互,更新Model,并将数据转换为View可以显示的格式。
适用场景
大型项目:适合大型项目,因为ViewModel可以很好地管理视图和模型之间的交互。
需要高可维护性和可扩展性的项目:ViewModel可以独立于View进行单元测试,提高代码的可维护性和可扩展性。
优缺点
优点:
ViewModel可以独立于View进行单元测试,提高测试覆盖率。
适合大型项目,结构清晰,易于维护和扩展。
与Flutter的StatefulWidget和StatelessWidget结合得很好。
缺点:
需要更多的代码来定义ViewModel和数据绑定。
代码结构相对复杂,新手上手可能需要一些时间。
推荐架构:MVVM

结构比起mvc的确难了不少,不过本就是中大型项目。只能硬头皮上了。
也不一定非要说mvvm。mvc,mvp等等按实际需要进行实际使用即可。不过练手用mvvm会提高熟悉度。

代码如下:

model 也放一起了,其实没有用到,只是为了符合结构。
ViewModel 如下:

import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'package:logger/logger.dart';


class ResponseResult {
  late int code;
  late String data;

  ResponseResult({required this.code, required this.data});

  factory ResponseResult.fromJson(Map<String, dynamic> json) {
    return ResponseResult(
      code: json['code'],
      data: json['data'],
    );
  }
}

class ApiModel extends ChangeNotifier {
  ResponseResult? _responseResult;
  ResponseResult? get responseResult => _responseResult;
  bool _isLoading = false;
  bool get isLoading => _isLoading;
  String _result = '';
  String get result => _result;

  Future<void> fetchHttp() async {
    _isLoading = true;
    notifyListeners();

    var url = 'https://api.apiopen.top/api/sentences';
    // url = 'https://cn.bing.com/';
    final response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      _result = response.body;
    } else {
      throw Exception('Failed to load user');
    }
    _isLoading = false;
    notifyListeners();
  }

  
}

view 如下:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smart_api/smartApi/model/api_model.dart';

class ApiDemo extends StatelessWidget {
  const ApiDemo({super.key});

  
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => ApiModel(),
      child: ApiView(),
    );
  }
}

class ApiView extends StatelessWidget {
  const ApiView({super.key});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ApiView'),
      ),
      body: Consumer<ApiModel>(builder: (context, viewModel, child) {
        if (viewModel.isLoading) {
          return Center(
            child: CircularProgressIndicator(),
          );
        } else {
          return Text(viewModel.result);
        }
      }),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.read<ApiModel>().fetchHttp();
        },
        child: Icon(Icons.send),
      ),
    );
  }
}

刚开始使用,的确不太友好,很多业务逻辑都不是很清晰,还需要再拆细致一些才能刚好理解

SmartApi开始折腾业务数据了,离原型版本又近一步了…


http://www.kler.cn/a/507536.html

相关文章:

  • 菜品管理(day03)
  • 【Gossip 协议】Golang的实现库Memberlist 库简介
  • 【c++继承篇】--继承之道:在C++的世界中编织血脉与传承
  • Python爬虫(5) --爬取网页视频
  • 1.8 GPT-4:开创人工智能的新纪元
  • 设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo
  • 阿里云通义实验室自然语言处理方向负责人黄非:通义灵码2.0,迈入 Agentic AI
  • matlab函数的主要目的是对包含在 Excel 电子表格中的实验数据进行模型拟合
  • 【k8s面试题2025】3、练气中期
  • 《机器学习》——SVD(奇异分解)降维
  • Go语言的编程范式
  • SpringBoot:RestTemplate与IllegalArgumentException
  • Springboot项目Jackson支持多种接收多种时间格式
  • C语言:-三子棋游戏代码:分支-循环-数组-函数集合
  • 如何利用CodeMeter保护您的物联网设备
  • XXL-JOB 加入 GitCode:推动分布式任务调度进阶发展
  • 【CLIP-LIT】Iterative Prompt Learning for Unsupervised Backlit Image Enhancement
  • 今日总结 2025-01-17
  • 【HBuilderX 中 Git 的使用】
  • C++通透讲解设计模式:依赖倒转(1)
  • 【MySQL】:事务
  • 什么是 OpenSSL?OpenSSL 如何工作?
  • hive连接mysql报错:Unknown version specified for initialization: 3.1.0
  • OpenCV入门学习
  • 讲一下ZooKeeper的持久化机制?
  • 【Linux】进程结束和进程等待