Flutter基础布局

news2024/11/27 4:38:17

Column:纵向布局

 Column相当于Android原生的LinearLayout线性布局。

主要代码:

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      height: double.infinity,
      color: Colors.white,
      child: const Column(
        //start:主轴容器内起始位排列
        //end:主轴容器内结束位排列
        //center:主轴容器内居中排列
        //spaceBetween:主轴容器内均匀排列(顶部底部无间距,间距相等)
        //spaceAround:主轴容器内相同间隔分布(顶部底部间距相等,控件之间间距相等)
        //spaceEvenly:主轴容器内等距离分布(顶部底部同等间距,间距相等)
        mainAxisAlignment: MainAxisAlignment.center,
        //start:横轴容器内起始位排列
        //end:横轴容器内结束位排列
        //center:横轴容器内居中排列
        //stretch:横轴容器内拉伸排列
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          IconContainer(Icons.home),
          IconContainer(Icons.search, color: Colors.yellow),
          IconContainer(Icons.ac_unit, color: Colors.orange)
        ],
      ),
    );
  }
}

mainAxisAlignment和crossAxisAlignment属性用于控制排列位置与控件之间距离。

完整代码:

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Flutter"),
        ),
        body: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      height: double.infinity,
      color: Colors.white,
      child: const Column(
        //start:主轴容器内起始位排列
        //end:主轴容器内结束位排列
        //center:主轴容器内居中排列
        //spaceBetween:主轴容器内均匀排列(顶部底部无间距,间距相等)
        //spaceAround:主轴容器内相同间隔分布(顶部底部间距相等,控件之间间距相等)
        //spaceEvenly:主轴容器内等距离分布(顶部底部同等间距,间距相等)
        mainAxisAlignment: MainAxisAlignment.center,
        //start:横轴容器内起始位排列
        //end:横轴容器内结束位排列
        //center:横轴容器内居中排列
        //stretch:横轴容器内拉伸排列
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          IconContainer(Icons.home),
          IconContainer(Icons.search, color: Colors.yellow),
          IconContainer(Icons.ac_unit, color: Colors.orange)
        ],
      ),
    );
  }
}

class IconContainer extends StatelessWidget {
  final Color color;
  final IconData icon;

  const IconContainer(this.icon, {Key? key, this.color = Colors.red})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      alignment: Alignment.center,
      width: 100,
      height: 100,
      color: color,
      child: Icon(icon, color: Colors.white, size: 28),
    );
  }
}

Row:横向布局

 主要代码:

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      height: double.infinity,
      color: Colors.white,
      child: const Row(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          IconContainer(Icons.home),
          IconContainer(Icons.search, color: Colors.yellow),
          IconContainer(Icons.ac_unit, color: Colors.orange)
        ],
      ),
    );
  }
}

Row和Column相对应,Row横向依次排列容器内的内容,Column纵向依次排列容器内的内容。属性介绍参考Column。

完整代码:

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Flutter"),
        ),
        body: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      height: double.infinity,
      color: Colors.white,
      child: const Row(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          IconContainer(Icons.home),
          IconContainer(Icons.search, color: Colors.yellow),
          IconContainer(Icons.ac_unit, color: Colors.orange)
        ],
      ),
    );
  }
}

class IconContainer extends StatelessWidget {
  final Color color;
  final IconData icon;

  const IconContainer(this.icon, {Key? key, this.color = Colors.red})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      alignment: Alignment.center,
      width: 100,
      height: 100,
      color: color,
      child: Icon(icon, color: Colors.white, size: 28),
    );
  }
}

Expanded

Expanded相当于Android原生的权重。

主要代码:

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const Column(
      children: [
        Expanded(
          flex: 1,
          child: IconContainer(Icons.home),
        ),
        Expanded(
          flex: 3,
          child: IconContainer(
            Icons.ac_unit,
            color: Colors.orange,
          ),
        ),
        Expanded(
          flex: 3,
          child: IconContainer(
            Icons.android,
            color: Colors.green,
          ),
        ),
      ],
    );
  }
}

flex属性相当于Android原生的layout_weight权重属性。

完整代码:

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Flutter"),
        ),
        body: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const Column(
      children: [
        Expanded(
          flex: 1,
          child: IconContainer(Icons.home),
        ),
        Expanded(
          flex: 3,
          child: IconContainer(
            Icons.ac_unit,
            color: Colors.orange,
          ),
        ),
        Expanded(
          flex: 3,
          child: IconContainer(
            Icons.android,
            color: Colors.green,
          ),
        ),
      ],
    );
  }
}

class IconContainer extends StatelessWidget {
  final Color color;
  final IconData icon;

  const IconContainer(this.icon, {Key? key, this.color = Colors.red})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      alignment: Alignment.center,
      width: 100,
      height: 100,
      color: color,
      child: Icon(
        icon,
        color: Colors.white,
        size: 28,
      ),
    );
  }
}

SizedBox

 SizedBox容器和Container容器类似,都可以用来装载控件,只是自带属性不一样,可以根据布局视情况而定。

完整代码:

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Flutter"),
        ),
        body: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: [
        SizedBox(
          width: double.infinity,
          height: 200,
          //设置网络图片
          child: Image.network(
            "https://www.itying.com/images/flutter/1.png",
            //fill:拉伸填充,父容器无留白,图片变形
            //contain:容纳,父容器有留白
            //cover:剪裁填充,父容器无留白
            //fitWidth:横向剪裁填充,可能有留白
            //fitHeight:纵向剪裁填充,可能有留白
            //none:全无,剪裁,可能有留白
            //不设置此属性:不剪裁,有留白
            //scaleDown:按比例缩放,有留白
            fit: BoxFit.cover,
          ),
        ),
        const SizedBox(height: 2),
        Row(
          children: [
            Expanded(
              flex: 3,
              child: SizedBox(
                height: 180,
                child: Image.network(
                  "https://www.itying.com/images/flutter/2.png",
                  fit: BoxFit.cover,
                ),
              ),
            ),
            Container(
              width: 2,
            ),
            Expanded(
              flex: 1,
              child: SizedBox(
                height: 180,
                child: Column(
                  children: [
                    Expanded(
                      flex: 1,
                      child: Image.network(
                        "https://www.itying.com/images/flutter/3.png",
                        fit: BoxFit.cover,
                      ),
                    ),
                    Container(
                      height: 2,
                    ),
                    Expanded(
                      flex: 1,
                      child: Image.network(
                        "https://www.itying.com/images/flutter/4.png",
                        fit: BoxFit.cover,
                      ),
                    ),
                  ],
                ),
              ),
            )
          ],
        )
      ],
    );
  }
}

Image.network中的fit属性相当于ImageView中的scaleType属性,具体用法请看上面代码注释或者看源码注释。

Stack

完整代码:

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Flutter"),
        ),
        body: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    //Stack:堆叠,相当Android原生的帧布局
    return Stack(
      alignment: Alignment.center,
      children: [
        Container(
          width: double.infinity,
          height: 300,
          color: Colors.green,
        ),
        Container(
          width: 200,
          height: 200,
          color: Colors.red,
        ),
        const Text("你好Flutter")
      ],
    );
  }
}

Stack:堆叠,相当Android原生的FrameLayout帧布局。

Positioned

 Positioned:定位布局相当于Android原生中的RelativeLayout相对布局。

 完整代码:

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Flutter"),
        ),
        body: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      height: 300,
      color: Colors.red,
      //Stack:堆叠
      child: Stack(
        children: [
          //Positioned:定位
          Positioned(
            left: 0,
            bottom: 0,
            child: Container(width: 100, height: 100, color: Colors.green),
          ),
          const Positioned(left: 0, bottom: 0, child: Text("你好Flutter"))
        ],
      ),
    );
  }
}

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

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

相关文章

Kotlin单例模式的一种懒汉模式写法

Kotlin单例模式的一种懒汉模式写法 class MyHelpler {companion object {private val singleHelpler by lazy(mode LazyThreadSafetyMode.SYNCHRONIZED) { MyHelpler() }fun instance() singleHelpler}fun sayHi() {println("fly")} }fun main(args: Array<Stri…

Java代码混淆技术学习

1. ClassFinal 1.1 创建springboot项目 不做过多演示 spring boot版本2.7.8 1.2 maven引入 <plugin><!-- https://gitee.com/roseboy/classfinal --><groupId>net.roseboy</groupId><artifactId>classfinal-maven-plugin</artifactId>&…

【C#】并行编程实战:使用 PLINQ(1)

PLINQ 是语言集成查询&#xff08;Language Integrate Query , LINQ&#xff09;的并行实现&#xff08;P 表示并行&#xff09;。本章将介绍其编程的各个方面以及与之相关的一些优缺点。 PLINQ 介绍 | Microsoft Learn了解如何使用 .NET 中的 PLINQ 并行执行查询。 PLINQ 代表…

人体微生物分布及其与人体的共生

我们知道&#xff0c;人体的皮肤、口腔、肺部、肠道、阴道等都是微生物的栖息地&#xff0c;每个部位都有独特的微生物群组成。微生物群受到基因、饮食、环境和生活方式等多种因素的影响。 当然&#xff0c;人体微生物群的组成也会随着年龄的增长而发生变化。从婴儿期到老年阶段…

什么皮肤微生物群:它是皮肤健康的关键吗?

在我们日常的护肤和美容过程中&#xff0c;我们经常听到关于皮肤的各种话题&#xff0c;从保湿到抗衰老&#xff0c;从痘痘到过敏... 随着科学的不断进步和技术的发展&#xff0c;人们开始逐渐发现&#xff0c;皮肤上隐藏着一个神秘的世界——皮肤微生物群。它在维护我们的皮肤…

CGLIB动态代理详解分析

一、介绍 CGLIB是强大的、高性能的代码生成库&#xff0c;被广泛应用于AOP框架&#xff0c;它底层使用ASM来操作字节码生成新的类&#xff0c;为对象引入间接级别&#xff0c;以控制对象的访问。CGLIB相比于JDK动态代理更加强大&#xff0c;JDK动态代理只能对接口进行代理&…

Django中如何正确使用 redis 如何在 Heroku 部署 Django时使用 Redis

文章目录 问题起源&#xff1a;AsyncWebsocketConsumer 中的 channel_layer解决方案安装 & 启动 redis安装 channel-redis更新 settings.py 的 redis 设置 Heroku 部署add-on 添加 Redis 组件settings.py 问题起源&#xff1a;AsyncWebsocketConsumer 中的 channel_layer 在…

真的不想搞清楚音频转换成mp3免费软件有哪些

曾经有一个音乐制作人&#xff0c;他有很多高质量的音频文件&#xff0c;但是他需要将它们转换成mp3格式才能分享给更多人。然而&#xff0c;他不想花费大量的金钱购买昂贵的软件。于是他开始寻找免费的音频转换软件&#xff0c;希望能够搞清楚音频转换成mp3免费软件有哪些。经…

SpringBoot教学资料5-SpringBoot一对多查询(带简单前端)

项目展示&#xff1a; 项目结构&#xff1a; SQL&#xff1a; CREATE TABLE t_article (id int(20) NOT NULL AUTO_INCREMENT COMMENT 文章id,title varchar(200) DEFAULT NULL COMMENT 文章标题,content longtext COMMENT 文章内容,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCR…

自制交流自动稳压器电路设计

目前在我国偏远的山区及农村&#xff0c;电网电压极不稳定&#xff0c;而且电压普遍偏低&#xff0c;有的电网电压只有 120V 左右。在这样的电网中&#xff0c;电视机及其它家用电器就无法正常使用了。市场上虽有较多的稳压器&#xff0c;但使用起来效果并不怎么好&#xff0c;…

Stable Diffusion 中Civitai站点模型管理助手

对于AI画画的读者来说&#xff0c;一旦开始使用Stable Diffusion&#xff0c;看到未曾使用过的模型&#xff0c;无法抑制下载的冲动。然而随着模型的堆积&#xff0c;整理及选择变得困难。此时Civitai Helper来解决这个问题。 文章目录 Civitai Helper插件安装模型信息模型更新…

Python WSGI 与 Web 开发框架

目录 文章目录 目录WSGIWSGI 的工作原理environ 参数start_resposne 参数 WSGI 的中间件 WSGI Web 开发框架OpenStack 中的应用案例进程入口WSGI Application 加载Paste/PasteDeployRoutesWebOb WSGI Server 启动 WSGI WSGI&#xff08;Web Server Gateway Interface&#xff…

【UE 材质】磨砂玻璃材质

效果 步骤 新建一个材质&#xff0c;这里命名为“M_FrostedGlass” 打开“M_FrostedGlass”&#xff0c;设置混合模式为半透明 添加如下节点&#xff1a; 创建一个材质实例 将材质实例赋予到一个mesh 打开材质实例&#xff0c;调整一下玻璃颜色和模糊值 原视频链接&#xff1a…

微信小程序UV、PV量解释以及接口调用频率

微信小程序UV、PV量 浏览量(PV)&#xff1a;即通常说的Page View(PV)&#xff0c;用户每打开一个网站页面就被记录1次。用户多次打开同一页面&#xff0c;浏览量值累计。微信小程序中PV是打开小程序的打开次数。 访客数(UV)&#xff1a;一天之内网站的独立访客数(以Cookie为依…

建立LIS系统需注意解决的问题

建立LIS需注意解决的问题 数据接收的可靠性&#xff1a;不管是采用硬件方式还是软件方式接收数据&#xff0c;保证接收过程数据不丢失或出现错误&#xff0c;是建立LIS首先要解决好的技术问题&#xff0c;否则就不是一个成功的LIS&#xff0c;缺乏实际的应用价值。 系统运行的…

vue3+vite使用particles.js

上效果&#xff1a; 1、安装vue3-particles 注意&#xff1a; 这里不能直接安装2.0以上的版本&#xff0c;否则界面无法出来。至于根本原因目前还没查到 # 通过以下命令可以发现当前所具有的版本 $ pnpm view vue3-particles versions [1.42.1, 1.42.2, 1.42.3, 1.42.4,1.43.…

【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)

一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战&#xff08;场景问题分析性能影响因素&#xff09; 常见的几个场景问题问题1&#xff1a;过期还是不过期缓存数据保证最终一致性 问题2&#xff1a;维度化缓存与增量更新通过维度化缓存优点和好处 问题3…

总在谈流程,却又做不好,问题出在哪?

时至今日&#xff0c;流程这个概念无论是在理论层面还是实践层面&#xff0c;都已为大家所熟知。 特别是随着华为的崛起&#xff0c;流程的吸引力与日俱增&#xff0c;为数不少的企业都在服用流程这剂灵丹妙药。 可是&#xff0c;真正搞明白流程概念的企业还不算多&#xff0…

win10开启远程桌面,win10开启3389端口

文章目录 前言一、不能远程桌面的原因1.1、系统设置未开启远程桌面功能1.2、开启防火墙3389端口1.3、开启3389端口 二、开启3389端口2.1、查看是否开启端口2.2、启动远程桌面服务2.3、远程连接administrator账号提示由于账户限制无法登录 三、其他 前言 最近重装了一下小主机系…

Unity 非父子物体保持相对静止

非父子物体保持相对静止 &#x1f354;效果&#x1f96a;食用 &#x1f354;效果 保持两个非父子关系的物体坐标、旋转相对静止 &#x1f96a;食用 插件下载 using System.Collections; using System.Collections.Generic; using UnityEngine;namespace ZYF {public class…