Flutter开发实践:用一套代码构建多端精美应用

news2024/10/5 13:04:39

在这里插入图片描述

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。
🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。
🎉欢迎 👍点赞✍评论⭐收藏

文章目录

  • 🚀一、背景
  • 🚀二、开始开发多端应用
    • 🔎2.1 安装Flutter
    • 🔎2.2 创建Flutter项目
    • 🔎2.3 编写共享代码
    • 🔎2.4 编写平台特定代码
    • 🔎2.5 运行应用
  • 🚀三、Flutter书籍推荐
    • 🔎3.1 书籍介绍
    • 🔎3.2 核心内容
    • 🔎3.3 特色
    • 🔎3.4 主要内容截图
    • 🔎3.5 如何领书
  • 🚀四、总结


🚀一、背景

在移动应用开发中,为了在不同平台上提供一致的用户体验,我们通常需要编写不同的代码来适应不同的操作系统和设备。但是有了Flutter,我们可以使用一套代码构建多个平台的应用,包括iOS、Android、Web和桌面。

在这里插入图片描述

本文将介绍如何使用Flutter来构建一套代码适配多端应用,并给出具体的步骤和示例代码。

🚀二、开始开发多端应用

🔎2.1 安装Flutter

首先,需要在您的计算机上安装Flutter。请按照Flutter官方文档的指引进行安装,并确保配置好Flutter环境变量。

🔎2.2 创建Flutter项目

使用命令行工具或者您喜欢的集成开发环境(IDE),创建一个新的Flutter项目。

$ flutter create multiplatform_app

这将在您的当前目录下创建一个名为multiplatform_app的Flutter项目。

🔎2.3 编写共享代码

在Flutter中,我们可以使用Dart语言编写共享代码,包括界面布局、业务逻辑等。创建一个名为shared的文件夹,并在其中创建一个名为shared.dart的文件。

该文件将包含我们要共享的代码。例如,以下是一个简单的计数器应用的示例:

class Counter {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
  }

  void decrement() {
    _count--;
  }
}

🔎2.4 编写平台特定代码

接下来,我们需要为每个目标平台编写特定的代码。在lib文件夹下,为不同的平台创建对应的文件夹,例如iosandroidwebdesktop

在各自的文件夹中,创建一个名为main.dart的文件,并编写平台特定的代码。以下是一个简单的示例:

// ios/main.dart
import 'package:flutter/cupertino.dart';
import 'package:multiplatform_app/shared/shared.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final Counter counter = Counter();

  
  Widget build(BuildContext context) {
    return CupertinoApp(
      home: CupertinoPageScaffold(
        navigationBar: CupertinoNavigationBar(
          middle: Text('Counter App'),
        ),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Count: ${counter.count}'),
              SizedBox(height: 16),
              CupertinoButton(
                child: Text('Increment'),
                onPressed: () => counter.increment(),
              ),
              SizedBox(height: 8),
              CupertinoButton(
                child: Text('Decrement'),
                onPressed: () => counter.decrement(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
// android/main.dart
import 'package:flutter/material.dart';
import 'package:multiplatform_app/shared/shared.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final Counter counter = Counter();

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Counter App',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Count: ${counter.count}'),
              SizedBox(height: 16),
              ElevatedButton(
                child: Text('Increment'),
                onPressed: () => counter.increment(),
              ),
              SizedBox(height: 8),
              ElevatedButton(
                child: Text('Decrement'),
                onPressed: () => counter.decrement(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
// web/main.dart
import 'package:flutter/material.dart';
import 'package:multiplatform_app/shared/shared.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final Counter counter = Counter();

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Counter App',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Count: ${counter.count}'),
              SizedBox(height: 16),
              ElevatedButton(
                child: Text('Increment'),
                onPressed: () => counter.increment(),
              ),
              SizedBox(height: 8),
              ElevatedButton(
                child: Text('Decrement'),
                onPressed: () => counter.decrement(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
// desktop/main.dart
import 'package:flutter/material.dart';
import 'package:multiplatform_app/shared/shared.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final Counter counter = Counter();

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Counter App',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Count: ${counter.count}'),
              SizedBox(height: 16),
              ElevatedButton(
                child: Text('Increment'),
                onPressed: () => counter.increment(),
              ),
              SizedBox(height: 8),
              ElevatedButton(
                child: Text('Decrement'),
                onPressed: () => counter.decrement(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

根据不同平台的特点,我们可以使用不同的UI组件和布局来创建界面。

🔎2.5 运行应用

最后,使用命令行工具或者IDE来运行应用程序。根据你选择的平台,执行相应的命令即可。

# 运行iOS应用
$ flutter run -d ios

# 运行Android应用
$ flutter run -d android

# 运行Web应用
$ flutter run -d chrome

# 运行桌面应用
$ flutter run -d windows

这样,您就可以在不同的平台上看到同一套代码构建的应用程序了!

总结:

  • 安装Flutter并配置环境变量
  • 创建Flutter项目
  • 编写共享代码
  • 为不同的平台编写特定代码
  • 运行应用程序

🚀三、Flutter书籍推荐

🔎3.1 书籍介绍

从零基础到精通Flutter开发

本书由浅入深地带领读者进入Flutter开发的世界,从Flutter的起源讲起,逐步深入Flutter进阶实战,并在最后配合项目实战案例,让读者不但可以系统地学习Flutter编程的相关知识,而且还能对Flutter应用开发有更为深入的理解

在这里插入图片描述

🔎3.2 核心内容

一套代码,构建多平台精美的应用:本书从真实的开发场景出发,完整地讲解了Flutter框架,帮助你快速掌握Flutter的基础知识和开发技巧,助你在移动应用开发领域取得成功!

🔎3.3 特色

经典:凝聚作者6年App开发经验,独家奉献开发技巧。
深入:从入门、进阶到实战开发,由浅入深,详细阐述Flutter开发技术。
全面:几乎涵盖了Flutter开发涉及的所有核心知识点,体现了从零基础到精通学习的全过程。
独立:各章内容相对独立,可以按照顺序阅读,也可以通过目录阅读需要的内容。

🔎3.4 主要内容截图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

🔎3.5 如何领书

————————————————
本次本篇文章送书 🔥1-2本 评论区抽1-2位小伙伴送书
活动时间:截止到 2023-12-10 20:00:00
抽奖方式:利用网络公开的在线抽奖工具进行抽奖
参与方式:关注、点赞、收藏,从评论区随机抽选小伙伴。
根据文章阅读量的多少来安排送书的本数。
————————————————

🔥 注:活动结束后,会私信中奖粉丝的,各位注意查看私信哦!

小伙伴也可以访问链接进行自主购买哦~

当当购买链接直达,京东购买链接

🚀四、总结

今天主要讲解了Flutter开发实践用一套代码构建多端精美应用的构建流程,初步认识了Flutter以及它解决了什么问题,最后还给大家推荐了书籍。希望本文对您有所帮助。

在这里插入图片描述
今天的内容就到这里,我们下次见。

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

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

相关文章

Linux C IO复用

IO复用 概述IO模型阻塞式IO非阻塞式IOIO复用select、poll、epoll异同 信号驱动式IO异步IO select函数select示例代码 poll函数poll示例代码 epoll函数创建  epoll_create注册、修改、删除  epoll_ctl轮询 I/O 事件的发生  epoll_waitepoll示例代码 基于TCP和epoll在线多人…

那仰望的人

心底的孤独和叹息

Python安装入门

目录 1 从应用商店安装2 通过官方安装3 验证安装是否成功4 打印hello world总结 1 从应用商店安装 推荐使用微软的应用商店安装,打开开始菜单 在应用商店搜索python 选择最新的版本下载并安装即可 2 通过官方安装 也可以使用官网的安装包,输入如下网…

低成本打造便携式无线网络攻防学习环境

1.摘要 一直以来, 无线网络安全问题与大众的个人隐私息息相关, 例如: 为了节省流量, 连接到一个看似安全的免费WiFi, 在使用过程中泄露自己的各类密码信息甚至银行卡账号密码信息。随着家用智能电器的普及, 家中的各类智能设备连入家里的无线网络, 却突然失灵, 甚至无法正常连…

解决Vision Transformer在任意尺寸图像上微调的问题:使用timm库

解决Vision Transformer在任意尺寸图像上微调的问题:使用timm库 文章目录 一、ViT的微调问题的本质二、Positional Embedding如何处理1,绝对位置编码2,相对位置编码3,对位置编码进行插值 三、Patch Embedding Layer如何处理四、使…

Public Key Retrieval is not allowed客户端连接

使用DBeavear或navicat连接mysql服务器时,报错Public Key Retrieval is not allowed 原因: 客户端默认禁用 SSL/TLS 协议,客户端会使用服务器的公钥进行传输,默认情况下客户端不会主动去找服务器拿公钥,进而会出现…

汇编-CALL和RET指令

CALL指令调用一个过程, 使处理器从新的内存位置开始执行。过程使用RET(从过程返回) 指令将处理器转回到该过程被调用的程序点上。 CALL指令的动作: 1.将CALL指令的下一条指令地址压栈(作为子过程返回的地址) 2.将被调过程的地址复制到指令指针寄存器E…

编译 CUDA加速的 OpenCV-4.8.0 版本

文章目录 前言一、编译环境二、前期准备三、CMake编译四、VS编译OpenCV.sln五、问题 前言 由于项目需要用上CUDA加速的OpenCV,编译时也踩了不少坑,所以这里记录一下。 一、编译环境 我的编译环境是: Win10 RTX4050 CUDA-12.0 CUDNN 8.9.…

关于测试用例,你知道多少?

前言 在此之前我搜集一些关于测试用例的知识,后来在我们的群里专门定了一期讨论,来探讨测试用例,毕竟这是一个很大的话题,很难做到面面俱到,但我会尽量全面,用通俗的语言来说测试用例。 1、测试用例(test …

【React-Router】路由快速上手

1. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 npm i react-router-dom2. 快速开始 // index.jsimport React from react; import ReactDOM from react-dom/client; import ./index.css; import App from ./App; i…

传统企业如何实现数字化转型?如何加快企业数字化转型?

科技的发展给社会带来了各种变革,技术日新月异,很多传统的东西都被大众抛之脑后,在这个以技术和数据运营为导向的数字化时代,传统企业想要保持足够的核心竞争力,就必须跟上时代的步伐,进行企业数字化转型&a…

git clone慢的解决办法

在网站 https://www.ipaddress.com/ 分别搜索: github.global.ssl.fastly.net github.com 得到ip: 打开hosts文件 sudo vim /etc/hosts 在hosts文件末尾添加 140.82.114.3 github.com 151.101.1.194 github.global-ssl.fastly.net 151.101.65.194 g…

【RocketMq系列-02】RocketMq的架构解析和高性能设计

RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709【二】RocketMq的架构解析和高性能设计/font>https://zhenghuisheng.blog.csdn.net/article/details/134559514 RocketMq的架构解析和高性能设…

[点云分割] 基于最小切割的分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <vector>#include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/cloud_viewer.h> #include <pcl/filters/filter_indices.h> #include…

B站已经部分上线前台实名,如不同意实名,后期账号流量将收影响!

B站部分百万粉丝博主的主页显示账号运营人名字的政策是从10月31日开始的。当天&#xff0c;B站官方发布了《哔哩哔哩关于头部“自媒体”账号前台实名的公告》&#xff0c;表明了其前台实名制的实施计划。 B站部分上线前台实名的过程可以追溯到2021年。当时&#xff0c;中国政府…

报表系统是什么?如何快速帮助企业数字化转型?

在信息洪流中&#xff0c;企业需要应对日益增长的数据量和复杂业务环境&#xff0c;这需要借助科技手段来驾驭数据管理和决策分析。报表系统&#xff0c;作为企业决策的重要工具&#xff0c;就如同航海的罗盘&#xff0c;帮助企业在数据的海洋中快速定位&#xff0c;从而提高管…

最常用的5款报表系统

在这个信息化飞速发展的时代&#xff0c;报表系统已经成为了企业管理和决策的重要工具。随着市场的需求不断增长&#xff0c;报表系统也在不断地更新和完善。如今&#xff0c;市面上有数不尽的报表系统&#xff0c;但是哪款才是最常用的呢&#xff1f;接下来&#xff0c;我们将…

慕尼黑电子展Samtec Demo | 回环测试带来Samtec产品组合优异表现

【摘要/前言】 大家好&#xff01;Electronica虎家展台Demo系列回来咯。 实践出真知&#xff0c;再好的纸面数据都不如来一场实际的测试和演示。Samtec团队始终在努力为客户带来卓越的产品和优质服务。而这其中&#xff0c;Demo演示的存在至关重要。演示过程可以为大家带来了…

AppLink结合金蝶云星空作订单信息同步流程

此次通过AppLink&#xff0c;根据请求数据金蝶云星空做销售订单信息同步拉取 在获取订单信息前需要得到金蝶云星空授权&#xff0c;详细授权步骤可查看&#xff1a;金蝶云星空授权指南 根据请求数据在金蝶云星空保存销售订单 当webhook接收到数据时触发流程 步骤1&#xff…

维护工程师面经

文章目录 前言技能要求数据结构定义分类常用的数据结构 数据库原理数据的三级模式结构事务查询方式视图数据库范式 Java相关知识点总结 前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&#xff1a; 参考网址 技能要求 数据结构 参考网址 定…