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

在这里插入图片描述

🏆作者简介,黑夜开发者,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以及它解决了什么问题,最后还给大家推荐了书籍。希望本文对您有所帮助。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四、文件包含漏洞

一、文件包含漏洞 解释:文件包含漏洞是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行;其还能够使得服务器上的源代码被读取,在PHP里面我们把可重复使用的函数写入到单个文件中&#x…

厦门某智慧社区的智慧排水监测系统实施落地

厦门某智慧社区的智慧排水监测系统实施落地 智慧社区的排水系统是一种高度智能化、高效且环保的排水解决方案,它结合了自动化控制系统、计算机网络技术、传感监测技术以及环保理念等多个领域的知识。其主要作用是确保社区的排水系统能够高效、稳定、环保地运行&…

如何用CHAT分析网络流行语的构成特点及趋势?

问CHAT:请分析下网络流行语的构成特点及趋势 CHAT回复: 网络流行语的构成特点: 1. 新颖性:网络流行语象征着新潮的概念、思想和观点,它们新颖独特且易于传播。 2. 深入人心的设定:网络流行语通常是由大众…

基于Vue3的低代码开发平台——JNPF

目录 一、什么是Vue.js ? 二、Jnpf-Web-Vue3 的技术栈介绍 (1)Vue3.x (2)Vue-router4.x (3)Vite4.x (4)Ant-Design-Vue3.x (5)TypeScript &#x…

这样写postman实现参数化,阿里p8都直呼牛逼

什么时候会用到参数化 比如:一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块:正确的用户名,密码 成功;错误的用户名,正确的密码 失败 postman实现参数化 在实际的接口测试中,部分参数…

猫罐头多久喂一次?放心猫罐头品牌推荐

猫罐头是猫咪喜爱的食物之一,然而,正确的喂养方法也是非常重要的。不能随意给猫咪喂食猫罐头。 作为从业6年的宠物护理师来说,只买合适的,贵的不如好的,只要配方不出错营养跟得上,观察自家猫咪体质真的基本…

【Mysql】[Err] 1293 - Incorrect table definition;

基本情况 SQL文件描述 /* Navicat MySQL Data TransferSource Server : cm4生产-200 Source Server Version : 50725 Source Host : 192.168.1.200:3306 Source Database : db_wmsTarget Server Type : MYSQL Target Server Version : 50725 File…

采用connector-c++ 8.0操作数据库

1.下载最新的Connector https://dev.mysql.com/downloads/connector/cpp/,下载带debug的库。 解压缩到本地,本次使用的是带debug模式的connector库: 注:其中mysqlcppconn与mysqlcppconn8的区别是: 2.在cmakelist…

面试官:什么是三色标记

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

14.(vue3.x+vite)组件间通信方式之pinia

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 Pinia简介 Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 Pinia与Vuex比较 (1)Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。 (2)pinia中只有state、getter、action,抛弃了Vu…

产品经理的具体工作职责有什么?

产品经理是现代企业中非常重要的一种职位,其工作职责也非常广泛和复杂。产品经理需要在市场、用户、技术等多个方面进行综合考虑,为企业开发出具有竞争力的产品,从而推动企业的发展。下面我们将详细介绍产品经理的具体工作职责。 一、市场调研…

第二十章 多线程

20.2创建线程 20.2.1继承Thread类 Thread类是Java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建议Thread实例。 public class ThreadTest extedns Thread{} run方法格式: public void run(){} 20.1让线…

opencv-2D直方图

cv2.calcHist() 是 OpenCV 中用于计算直方图的函数。它可以计算一维或多维直方图,用于分析图像中像素值的分布。 基本的语法如下: hist cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])参数说明: images:…

Verilog开源项目——百兆以太网交换机(三)Hash模块设计

Verilog开源项目——百兆以太网交换机(三)Hash模块设计 🔈声明:未经作者允许,禁止转载 😃博主主页:王_嘻嘻的CSDN主页 🔑全新原创以太网交换机项目,Blog内容将聚焦整体架…

TypeScript 学习笔记 第二部分 webpack 创建typescript项目

【视频链接】尚硅谷TypeScript教程(李立超老师TS新课) 创建webpack 项目 IDE:webstorm 新建一个空的项目运行npm init初始化项目目录结构 1. 安装 webpack:构建工具webpack-cli: webpack的命令行工具typescript&am…

【图数据库实战】gremlin语法

Gremlin 是 Apache TinkerPop 的图遍历语言。Gremlin 是一种函数式数据流语言,使用户能够简洁地表达对其应用程序属性图的复杂遍历(或查询)。每个 Gremlin 遍历都由一系列(可能嵌套的)步骤组成。步骤对数据流执行原子操…

2023.11.22 homework

七年级数学 五年级数学 也不知道可以教到几年级,估计很快就教不动了。人生啊。

nginx-日志

nginx 日志介绍 nginx总共有两种日志 一种是access_log 另一种是 error_log 前者是访问日志,后者是错误日志。 1 错误日志 error-log 日志 开启的方式通过 error_log 开启,是不能指定格式的 # 指定错误日志的路径和日志级别,此指令可以在[全局块、http…

2023.11.22 数据仓库2-维度建模

目录 1.数仓建设方案 2.数仓结构图,项目架构图 2.1项目架构图 2.2数仓结构图 3.建模设计 4.维度建模 什么是事实表: 什么是维度表: 数据发展模式y以及对应的模型 5.数仓建设规范 数据库划分规范 表命名规范 表字段类型规范 1.数仓建设方案 ODS: 源数据层(临时存储层) 贴…

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

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