Flutter仿微信,高度还原,开源

news2024/11/22 11:44:40

Flutter仿微信开源项目,持续更新中

    • Flutter仿微信项目,已开源🚀🚀🚀
      • 说明
      • 效果预览
      • 开发进度说明
      • 未来计划
      • 项目结构说明
      • 组件封装示例
      • 最后
      • 持续更新中...

Flutter仿微信项目,已开源🚀🚀🚀

重磅开源!持续更新中…

开源地址:https://gitee.com/ruirui-study/flutter_weixin_dart35

项目环境

  • flutter 3.24.3
  • dart 3.5

说明

本项目是纯flutter仿微信项目,主要是还原了微信的界面,暂时没加入具体的功能,主要是为了帮助大家学习与熟悉Flutter组件库、插件、dart等语法的使用。

看完本项目,你将学到如下内容:

  • 熟悉Flutter常用组件库,如按钮,输入框,文本、布局、定位、图片、图标等的使用
  • 了解Flutter组件的封装、抽离、组合等,类似与Vue
  • 了解组件之间的传值、全局传值、事件等
  • 了解组件的生命周期
  • 学习使用第三方库;
  • 打包、配置、发布项目等。

效果预览

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

开发进度说明

  • 项目初始化
  • 配置路由、主题
  • 封装权限管理
  • 封装公共页、toast、dialog等组件
  • 四个tab页
  • 聊天页、信息页
  • 朋友圈页、拍照、选择图片
  • 我的页、钱包页、个人信息页、服务页
  • 各种具体的聊天页
  • 发布朋友圈页
  • 聊天列表各种状态的完善
  • 搜索页
  • 扫一扫等功能
  • 全局状态管理
  • 登录页、注册页,退出等功能

未来计划

  • 完善主要的各个页码
  • 全局状态管理优化
  • 完善项目文档
  • 加入有后台请求的版本

项目结构说明

在这里插入图片描述

组件封装示例

封装公共组件common_page.dart,具体参数见代码注释

import 'package:flutter/material.dart';
import '/utils/setting.dart';

// 公共页面组件
class CommonPage extends StatelessWidget {
  final String? title; // 可选的 页面标题
  final Widget child; // 页面组件
  final List<Widget>? actions; // 可选的操作按钮列表
  final Color? appBarBgColor; // 可选的 appBar 背景色
  final bool? isShowLine; // 是否显示底部的细线

  const CommonPage({
    super.key,
    this.title,
    required this.child,
    this.actions,
    this.appBarBgColor,
    this.isShowLine
  });

  
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: DefaultColor.primary,
      appBar: AppBar(
        title: title == null ? null : Text(title!, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w500)) ,
        centerTitle: true,
        backgroundColor: appBarBgColor ?? DefaultColor.primary,
        actions: actions ?? const [],
        // leading: IconButton(
        //   icon: const Icon(Icons.arrow_back_ios), // 这里设置你的自定义图标
        //   onPressed: () => Navigator.of(context).pop(),
        // ),
        bottom: (isShowLine != null && isShowLine! ) ? PreferredSize(
          preferredSize: const Size.fromHeight(1.0),
          child: Container(
            color: const Color(0xE3DEDEFF),
            height: 1.0,
          ),
        ) : null,
      ),
      body: Container(
        color: DefaultColor.primary,
        child: child,
      ),
    );
  }
}

其他页面直接引入并使用

import 'package:flutter/material.dart';
import '/components/page/common.dart';

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

  
  Widget build(BuildContext context) {
    return CommonPage(
      title: '通讯录',
      actions: [const SearchAction(), popupMenuWidget()],
      child: Container(
        color: Colors.white,
        child: const ContactWidget(),
      ),
    );
  }
}

类似地,还封装了dialog组件,示例代码如下

import 'package:flutter/material.dart';

// 封装确定弹框
Future<bool?> customShowDialog(BuildContext context, {
  String? title = '',
  required String tipText,
  String? confirmText = '确定',
  String? cancelText = '取消',
}) {
  return showDialog<bool>(
    context: context,
    builder: (BuildContext context) {
      return AlertDialog(
        title: title == '' || title == null ? null : Text(title),
        content: Text(tipText),
        actions: <Widget>[
          TextButton(
            style: TextButton.styleFrom(
              textStyle: Theme.of(context).textTheme.labelLarge,
            ),
            child: Text(cancelText!),
            onPressed: () {
              Navigator.pop(context, false);
            },
          ),
          TextButton(
            style: TextButton.styleFrom(
              textStyle: Theme.of(context).textTheme.labelLarge,
            ),
            child: Text(confirmText!),
            onPressed: () {
              Navigator.pop(context, true);
            },
          ),
        ],
      );
    },
  );
}

最后

想学习好flutter,需要投入一定的精力,因为这毕竟算是一门新语言,嵌套虽然多,但是都是可以拆解的。
本人也是前端开发,个人感觉FlutterVue有相似的地方,给大家推荐几个学习网站

  • Flutter官网:https://flutter.cn/
  • dart官网:https://dart.cn/
  • flutter电子书:https://book.flutterchina.club/
  • flutter图标网:https://fluttericon.cn/
  • flutter插件库(类似于npn):https://pub-web.flutter-io.cn/

持续更新中…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HBA:基于分层激光雷达集束调整的一致性建图

文章目录 前言一、介绍二、相关工作三、方法A. 概述B. 自底向上的分层BA&#xff08;Bundle Adjustment&#xff09;C. 自顶向下位姿图优化 四. 实验A. 精度分析 前言 代码&#xff1a;github 原文&#xff1a;原文 摘要——重建准确且一致的大规模LiDAR点云地图对机器人应用至…

Docker — 跨平台和环境部署

Docker 是一个开源的容器化平台&#xff0c;通过将应用程序和其依赖打包在一个轻量级、独立的容器中&#xff0c;能够跨平台和环境部署。 1. Docker 基本概念 镜像 (Image)&#xff1a;Docker 镜像是一个只读模板&#xff0c;包含运行应用程序所需的代码、库、依赖和环境配置。…

消息队列-Rabbitmq(消息发送,消息接收)

将来我们开发业务功能的时候&#xff0c;肯定不会在控制台收发消息&#xff0c;而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议&#xff0c;因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息&#xff0c;都可以与RabbitMQ交互。并且RabbitMQ官方也提供了各种不…

一机多控无人机集群飞行控制技术详解

一机多控无人机集群飞行控制技术是指通过单一控制端或多个协同工作的控制端&#xff0c;对多架无人机进行集群管理和控制的技术。这种技术结合了通信技术、路径规划、碰撞避免、分布式与集中式控制等多个方面&#xff0c;以实现无人机集群的协同作战或完成其他特定任务。以下是…

DEVOPS: 认证与调度

概述 不知道大家有没有意识到一个现实&#xff0c;就是大部分时候&#xff0c;我们已经不像以前一样通过命令行&#xff0c;或者可视窗口来使用一个系统了现在我们上微博、或者网购&#xff0c;操作的其实不是眼前这台设备&#xff0c;而是一个又一个集群 通常&#xff0c;这样…

【鸢尾花书籍】编程不难

&#x1f4dd;本文介绍 本文为作者拜读鸢尾花书籍《编程不难》后所做的笔记&#xff0c;整理成文章&#xff0c;以供回顾 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;htt…

HTML 文档规范与解析模式:DOCTYPE、<html> 标签以及结构化页面

文章目录 `<!DOCTYPE html>` 文档类型声明标准模式与怪异模式HTML5 的简化声明`<html>` 标签`<head>` 标签`<body>` 标签小结<!DOCTYPE html> 文档类型声明 在 HTML 文档中,<!DOCTYPE html> 是一个重要的文档类型声明,主要用于告知浏览…

CFA全球投资分析大赛专访:与投资人胡建平共话投资智慧

在复杂多变的金融市场中&#xff0c;每一个精准的投资决策背后&#xff0c;都隐藏着无数次的策略考量与深入分析。CFA全球投资分析大赛&#xff0c;作为业界公认的检验投资能力的舞台&#xff0c;每年都会吸引来自世界各地的顶尖投资者一展身手。今年&#xff0c;我们有幸在比赛…

Halcon 一维卡尺测量找点之模糊集测量法

模糊测量是对标准测量的一种扩展&#xff0c;并不意味着测量是“模糊的”&#xff0c;而是用模糊隶属函数来控制边缘的选择。所谓的模糊隶属函数&#xff0c;就是将边缘的特征值转换为隶属度值&#xff0c;基于这些隶属值做出是否选择边缘的决定&#xff0c;即当隶属值大于你设…

快速SEO致胜:提升网站成效的8个步骤

搜索引擎优化&#xff08;SEO&#xff09;决定您网站的可见性和整体成效。 如今&#xff0c;仅仅拥有一个网站是不够的 – 您的网站需要在搜索引擎结果中排名靠前才能吸引流量并产生参与度。 幸运的是&#xff0c;改善您的 SEO 并不总是需要技术专长或复杂的策略。 在这篇文…

Java ==> String类(字符串)

文章目录 一、认识String类1、创建String对象2、不可变的String3、字符串常量池 二、字符串常用操作1、字符串比较1.1 用“”比较1.2 用equals()方法比较1.3用compareTo()方法进行比较 2、获取字符串长度3、字符串查找4、字符串转换4.1valueOf()数值转换为字符串4.2字母大小写转…

使用Github下载YOLO v5项目教程

目录 1、首先打开Github 2、在搜索框搜索yolov5 3、找到合适的yolov5版本 4、选择版本 5、下载 1、首先打开Github 2、在搜索框搜索yolov5 3、找到合适的yolov5版本 这里以第一个为例 4、选择版本 版本的选择要根据自己python的版本以及安装的库的版本&#xff0c;在requi…

leetcode 2710 移除字符串中的尾随零

1.题目要求: 2.题目代码: class Solution { public:string removeTrailingZeros(string num) {while(num[num.size() - 1] 0){num.pop_back();}return num;} };

033_Structure_Static_In_Matlab求解结构静力学问题两套方法

结构静力学问题 静力学问现在是已经很简单的问题&#xff0c;在材料各向同性的情况下&#xff0c;对于弹性固体材料&#xff0c;很容易通过有限元求解。特别是线弹性问题&#xff0c;方程的矩阵形式可以很容易的写出&#xff08;准确得说是很容易通过有限元表达&#xff09;&a…

01.如何用DDD重构老项目

学习资料来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 动机DDD与重构实践重构? 重写从一开始就采用DDD重构步骤1. 添加领域模块2.分离出有价值的代码3.迁移到领域模块4.重复2,3 动机 …

v-on:注册事件(可用@代替:@事件名)

目录 1.v-on&#xff1a; 2.页面效果 3.结构 v-on&#xff1a; (1)作用&#xff1a;注册事件添加监听提供处理逻辑 (2)语法&#xff1a; &#xff08;后&#xff1a;提供处理逻辑&#xff09; ①v-on:事件名"内联语句" ②v-on:事件名"methods中的函数名 一、…

基于OSS搭建在线教育视频课程分享网站

OSS对象存储服务是海量、安全、低成本、高持久的存储服务。适合于存储大规模非结构化数据&#xff0c;如图片、视频、备份文件和容器/虚拟机镜像等。 安装nginx wget https://nginx.org/download/nginx-1.20.2.tar.gz yum -y install zlib zlib-devel gcc-c pcre-devel open…

C++ | Leetcode C++题解之第520题检测大写字母

题目&#xff1a; 题解&#xff1a; class Solution { public:bool detectCapitalUse(string word) {// 若第 1 个字母为小写&#xff0c;则需额外判断第 2 个字母是否为小写if (word.size() > 2 && islower(word[0]) && isupper(word[1])) {return false;…

SpringBoot中@Validated或@Valid注解校验的使用

文章目录 SpringBoot中Validated或Valid注解校验的使用1. 添加依赖2. 使用示例准备2-1 测试示例用到的类2-2 实体Dto&#xff0c;加入校验注解2-2 Controller 3. 示例测试4. Valid 和 Validated注解详解4-1 常用规则注解4-2 分组验证4-2-1 示例准备4-2-2 Controller接口4-2-3 P…

Rust 力扣 - 1297. 子串的最大出现次数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 越短的子串出现的次数越多&#xff0c;我们只需要求某个长度为min_size的子串出现的次数&#xff0c;并且该子串中不重复字符小于等于max_letters的数量 遍历长度长度为min_size的子串&#xff0c;然后将不重复…