Flutter 基础-上

news2025/1/18 11:55:07

一、初始化项目

在这里插入图片描述

  • Material Design (Google 推出的前端UI 解决方案)
    • 官网: https://www.material.io/
    • 中文网: https://material-io.cn/
  • Flutter 中一切内容都是组件(Widget)
    • 无状态组件(StatelessWidget)
    • 有状态组件(StatefulWidget)

二、app结构

  • MaterialApp
    • title (任务管理器中的标题)
    • home (主内容)
    • debugShowCheckedModeBanner (是否显示左上角调试标记)
  • Scaffold
    • appBar (应用头部)
    • body (应用主体)
    • float ingAct ionButton (浮按)
    • drawer (左侧抽菜单)
    • endDrawer (右侧抽菜单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("首页"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: HelloFlutter()
    );
  }
}

class HelloFlutter extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Text(
          "Hello Flutter",
          textDirection: TextDirection.ltr,
        )
      )
    );
  }
}

三、文本组件Text

  • Text
    • TextDirection (文本方向)
    • TextStyle (文本样式)
      • Colors (文本颜色)
      • FontWeight (字体细)
      • FontStyle (字体样式)
    • TextAlign (文本对齐)
    • TextOverflow (文本出)
    • maxLines (指定显示的行数)
  • RichText与TextSpan
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Text"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: TextDemo()
    );
  }
}

class TextDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text(
          "Flutter 是谷歌开发的一款开源、免费的,基于 Dart 语言的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生应用。",
          textDirection: TextDirection.ltr,
          style: TextStyle(
            fontSize: 30,
            color: Colors.red,
            fontWeight: FontWeight.w500,
            fontStyle: FontStyle.italic,
            decoration: TextDecoration.lineThrough,
            decorationColor: Colors.blue,
            // fontFamily: 'SourceSansPro',
          ),
          textAlign: TextAlign.left,
          maxLines: 3,
          overflow: TextOverflow.ellipsis,
          textScaleFactor: 1.5,
        ),
        RichText(
          text: TextSpan(
            text: "Hello",
            style: TextStyle(
              fontSize: 40,
              color: Color.fromARGB(255, 0, 0, 255)
            ),
            children: [
              TextSpan(
                text: "Flutter",
                style: TextStyle(
                  fontSize: 40,
                  color: Color.fromRGBO(255, 0, 0, 0.5)
                ),
              ),
              TextSpan(
                text: "你好世界",
                style: TextStyle(
                  fontSize: 30,
                  color: Color.fromARGB(0xFF, 0x00, 0xFF, 0x00)
                ),
              )
            ]
          ),
        )
      ],
    );
  }
}

在这里插入图片描述

四、设置自定义字体

  • 下载并导入字体
    • https://fonts.google.com/
    • 加压压缩包,将字体文件复制到Flutter项目中
  • 在pubspec.yaml中声明字体
    在这里插入图片描述
  • 使用
    • 为整个应用设置默认自定义字体
    • 为某个组件设置自定义字体

五、常用

  • I con
    • Flutter 中的图标库Icon (Icons. 具体名称)
  • 在线预览
    • https://material. io/resources/icons

六、color

在这里插入图片描述

  • 布局- Container
  • child (声明子组件)
  • padding (margin)
    • Edgelnsets (all(), fromLTRB(), only())
  • decoration
    • BoxDecoration (边框、圆角、渐变、阴影、背景色、背景图片)
  • alignment
    • Alignment (内容对齐)
  • transform
    • Matrix4 (移- translate,旋转 - rotate、缩放- scale、斜切 - skew)
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Text"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: ContainerDemo()
    );
  }
}

class ContainerDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      child: Text(
        "Flutter 是谷歌开发的一款开源、免费的,基于 Dart 语言的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生应用。",
        style: TextStyle(
          fontSize: 20
        ),
      ),
      // width: 200,
      // height: 200,
      width: double.infinity,
      height: double.infinity,
      padding: EdgeInsets.all(10.0),
      margin: EdgeInsets.fromLTRB(10.0, 30.0, 0.0, 5.0),
    );
  }
}

七、container-盒子

  • child(声明子组件)
  • padding (margin)
    • Edgelnsets (all()、 fromLTRB()、 only())
  • decoration
    • BoxDecoration(边框、圆角、渐变、阴影、背景色、背景图
  • alignment
    • Alignment (内容对齐)
  • transform
    • Matrix4(平移 -translate、旋转-rotate、缩放 -scale、斜切 -skew)
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Text"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: ContainerDemo()
    );
  }
}

class ContainerDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      child: Text(
        "Flutter 是谷歌开发的一款开源、免费的,基于 Dart 语言的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生应用。",
        style: TextStyle(
          fontSize: 20
        ),
      ),
      // width: 200,
      // height: 200,
      width: double.infinity,
      height: double.infinity,
      padding: EdgeInsets.all(10.0),
      margin: EdgeInsets.fromLTRB(10.0, 30.0, 0.0, 5.0),
    );
  }
}

八、布局-线性布局

  • Column
    • Column 中的主轴方向是垂直方
    • mainAxisAlignment:MainAxisAlignment 主轴对齐方
    • crossAxisAlignment: CrossAxisAlignment 交叉抽对齐方式
    • children: 内容
  • Row
    • Row 中的主轴方向是水平方向(其他属性与 Column 一致)
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Column_Row"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: ColumnRowDemo()
    );
  }
}

class ColumnRowDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      color: Colors.lightGreen,
      width: double.infinity,
      child: Column(
        // 主轴的对齐方式
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        // 交叉轴的对齐方式
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Icon(Icons.access_alarms, size: 50),
          Icon(Icons.accessible_forward_rounded, size: 50),
          Icon(Icons.settings, size: 50),
          Icon(Icons.add_box, size: 50),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [
              Icon(Icons.access_alarms, size: 50),
              Icon(Icons.accessible_forward_rounded, size: 50),
              Icon(Icons.settings, size: 50),
              Icon(Icons.add_box, size: 50),
            ],
          ),
        ],
      )
    );
  }
}

九、布局-弹性布局

  • Flex
    • direction (声明主轴方向)
    • mainAxisAlignment (声明主轴对齐方式)
    • textDirection (声明水平方向的排列顺序)
    • crossAxisAlignment (声明交叉轴对齐方式)
    • verticalDirection (声明垂直方向的排列顺序)
    • children (声明子组件)
  • Expanded (可伸缩组件)
    • flex (声明弹性布局所占比例
    • child (声明子组件)
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Flex"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: FlexDemo()
    );
  }
}

class FlexDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Column(
      children: [
        // 验证 Expanded
        Row(
          children: [
            Container(
              color: Colors.lightBlue,
              height: 50,
              width: 50,
            ),
            Expanded(
              child: Container(
                color: Colors.lightGreen,
                height: 50,
              ),
            )
          ],
        ),
        Flex(
          direction: Axis.horizontal,
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          // 声明水平方向的排列方式
          textDirection: TextDirection.rtl,
          children: [
            Icon(Icons.access_alarms, size: 50),
            Icon(Icons.accessible_forward_rounded, size: 50),
            Icon(Icons.settings, size: 50),
            Icon(Icons.add_box, size: 50),
          ],
        ),
        Flex(
          direction: Axis.horizontal,
          children: [
            Expanded(
              child: Container(
                color: Colors.tealAccent,
                height: 50,
              ),
              flex: 2,
            ),
            Expanded(
              child: Container(
                color: Colors.amberAccent,
                height: 50,
              ),
              flex: 1,
            )
          ],
        ),
        Container(
          height: 100,
          margin: EdgeInsets.all(50),
          child: Flex(
            direction: Axis.vertical,
            verticalDirection: VerticalDirection.up,
            children: [
              Expanded(
                child: Container(
                  color: Colors.tealAccent,
                  height: 50,
                ),
                flex: 2,
              ),
              // Spacer(
              //   flex: 1
              // ),
              Expanded(
                child: Container(
                  color: Colors.amberAccent,
                  height: 50,
                ),
                flex: 1,
              )
            ],
          ),
        ),
      ],
    );
  }
}

十、布局-流式布局

  • Wrap(解决内容溢出问题)
    • spacing(主轴方向子组件的间距)
    • alignment (主轴方向的对齐方式)
    • runSpacing(纵轴方向子组件的间距)
    • runAlignment (纵轴方向的对齐方式)
  • Chip (标签)
  • CircleAvatar (圆形头像)

在这里插入图片描述

import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Wrap"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: WrapDemo()
    );
  }
}

class WrapDemo extends StatelessWidget {
  List<String> _list = [
    '曹操', '司马懿', '曹仁', '曹洪', '张辽', '许褚'
  ];

  List<Widget> _weiGuo() {
    return _list.map((item) => Chip(
      avatar: CircleAvatar(
        backgroundColor: Colors.pink,
        child: Text('魏'),
      ),
      label: Text(item),
    )).toList();
  }

  
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        Wrap(
          children: _weiGuo(),
          spacing: 18.0, // 水平方向的间距
          alignment: WrapAlignment.spaceAround, // 主轴方向的对齐方式
          runSpacing: 100, // 垂直方向的间距
          // runAlignment: WrapAlignment.spaceAround, // 交叉轴方向i的对齐方式
        ),

        Wrap(
          children: [
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('蜀'),
              ),
              label: Text('刘备'),
            ),
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('蜀'),
              ),
              label: Text('关羽'),
            ),
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('蜀'),
              ),
              label: Text('张飞'),
            ),
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('蜀'),
              ),
              label: Text('赵云'),
            ),
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('蜀'),
              ),
              label: Text('诸葛亮'),
            ),
            Chip(
              avatar: CircleAvatar(
                backgroundColor: Colors.blue,
                child: Text('蜀'),
              ),
              label: Text('黄忠'),
            ),
          ],
        ),
      ],
    );
  }
}

十一、布局-层叠布局

  • Stack (层叠组件-类似 css 中的 z-index)
    • alignment (声明未定位子组件的对齐方式)
    • textDirection (声明未定位子组件的排列顺序)
  • Positioned (绝对定位组件)
    • child (声明子组件)
    • left、 top、 right、 bottom
    • width、 height
  • Networklmage (网络图片组件)
    • Networklmage(‘图片地址’)
    • <uses-permission android:name=“android.permission.INTERNET” />

配置网络图片访问权限
在这里插入图片描述
设置允许访问http协议
在这里插入图片描述

import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("层叠布局"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: StackDemo()
    );
  }
}

class StackDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      child: Stack(
        // 声明未定位的子组件的排序方式
        textDirection: TextDirection.rtl,
        // 声明未定位的子组件的对齐方式
        alignment: AlignmentDirectional.bottomEnd,
        children: [
          CircleAvatar(
            backgroundImage: NetworkImage('http://img12.360buyimg.com/n1/jfs/t1/133894/17/20175/388796/5fdb4134E17deda69/15535fe4303a1630.png'),
            radius: 200,
          ),
          Positioned(
            child: Container(
              color: Colors.red,
              padding: EdgeInsets.all(10),
              child: Text(
                '热卖',
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 20
                ),
              )
            ),
            top: 50,
            right: 40
          ),
          Text(
            'Hello',
            style: TextStyle(
              color: Colors.black,
              fontSize: 40
            ),
          )
        ],
      )
    );
  }
}

十二、布局-Card

  • Card(卡片)
    • child 子组件
    • color 背景色
    • shadowColor 阴影色
    • elevation 阴影高度
    • shape 边框样式
    • margin 外边距
  • ListTile (列表瓦片)
    • leading(头部组件)
    • title (标题)
    • subtitle (子标题)
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("卡片"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: CardDemo()
    );
  }
}

class CardDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Column(
      children: [
        Card(
          margin: EdgeInsets.all(30),
          color: Colors.purpleAccent[100],
          shadowColor: Colors.yellow, // 阴影颜色
          elevation: 20, // 阴影高度
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(40),
            side: BorderSide(
              color: Colors.yellow,
              width: 3,
            ),
          ),
          child: Column(
            children: [
              ListTile(
                leading: Icon(
                  Icons.supervised_user_circle_rounded,
                  size: 50
                ),
                title: Text(
                  "张三",
                  style: TextStyle(
                    fontSize: 30
                  ),
                ),
                subtitle: Text(
                  "董事长",
                  style: TextStyle(
                    fontSize: 20
                  ),
                ),
              ),
              Divider(),
              ListTile(
                title: Text(
                  "电话:13333333333",
                  style: TextStyle(
                    fontSize: 20
                  ),
                ),
              ),
              ListTile(
                title: Text(
                  "地址:XXXXXXXX",
                  style: TextStyle(
                    fontSize: 20
                  ),
                ),
              )
            ],
          )
        ),
        Card(
          margin: EdgeInsets.all(30),
          child: Column(
            children: [
              ListTile(
                leading: Icon(
                  Icons.supervised_user_circle_rounded,
                  size: 50
                ),
                title: Text(
                  "李四",
                  style: TextStyle(
                    fontSize: 30
                  ),
                ),
                subtitle: Text(
                  "总经理",
                  style: TextStyle(
                    fontSize: 20
                  ),
                ),
              ),
              Divider(),
              ListTile(
                title: Text(
                  "电话:13333333333",
                  style: TextStyle(
                    fontSize: 20
                  ),
                ),
              ),
              ListTile(
                title: Text(
                  "地址:XXXXXXXX",
                  style: TextStyle(
                    fontSize: 20
                  ),
                ),
              )
            ],
          )
        )
      ],
    );
  }
}

效果:在这里插入图片描述

十三、按钮

  • Flutter 1.22之前
    • FlatButton(扁平按钮)
    • RaisedButton (凸起按钮)
    • OutlineButton (轮廓按钮)
  • Flutter 1.22之后
    • TextButton (文本按钮-用来替换 FlatButton)
    • ElevatedButton (凸起按钮-用来替换 RaisedButton)
    • OutlinedButton(轮廓按钮-用来替换 OutlineButton)

旧按钮 vs 新按钮

为什么会新增按钮?

以前的按钮调整为统一的外观比较麻烦,经常自定义大量按钮样式新按钮将外观属性集合为一个 ButtonStyle,非常方便统一控制。

在这里插入图片描述

按钮

  • 图标按钮
    • IconButton
    • TextButton.icon()
    • ElevatedButton.icon()
    • OutlinedButton.icon()
  • ButtonBar (按钮组)
  • FloatingActionButton (浮动按钮)
  • BackButton (回退按钮)
  • CloseButton (关闭按钮)
import 'dart:ui';

import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Button"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: ButtonDemo(),
      floatingActionButton: FloatingActionButton(
        onPressed: (){},
        tooltip: 'Increment',
        child: Icon(Icons.add),
        backgroundColor: Colors.green,
        elevation: 0,
      ),
    );
  }
}

class ButtonDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(10),
      child: Wrap(
        children: [
          TextButton(
            onPressed: () {
              print('点击 TextButton');
            }, 
            onLongPress: () {
              print('长按 TextButton');
            },
            child: Text('TextButton')
          ),
          ElevatedButton(
            onPressed: () {
              print('点击 ElevatedButton');
            }, 
            onLongPress: () {
              print('长按 ElevatedButton');
            },
            child: Text('ElevatedButton')
          ),
          OutlinedButton(
            onPressed: () {
              print('点击 OutlinedButton');
            }, 
            onLongPress: () {
              print('长按 OutlinedButton');
            },
            child: Text('OutlinedButton')
          ),
          OutlinedButton(
            onPressed: () {
              print('点击 OutlinedButton');
            }, 
            onLongPress: () {
              print('长按 OutlinedButton');
            },
            child: Text('轮廓按钮'),
            style: ButtonStyle(
              textStyle: MaterialStateProperty.all(
                TextStyle(
                  fontSize: 30
                )
              ),
              foregroundColor: MaterialStateProperty.resolveWith((states) {
                if (states.contains(MaterialState.pressed)) {
                  // 按下按钮时的前景色
                  return Colors.red;
                }
                // 默认状态的颜色
                return Colors.blue;
              }),
              backgroundColor: MaterialStateProperty.resolveWith((states) {
                if (states.contains(MaterialState.pressed)) {
                  // 按下按钮时的前景色
                  return Colors.yellow;
                }
                // 默认状态的颜色
                return Colors.white;
              }),
              shadowColor: MaterialStateProperty.all(Colors.yellow),
              elevation: MaterialStateProperty.all(20),
              side: MaterialStateProperty.all(
                BorderSide(
                  color: Colors.green,
                  width: 2,
                )
              ),
              // 声明按钮形状
              shape: MaterialStateProperty.all(
                StadiumBorder(
                  side: BorderSide(
                    color: Colors.green,
                    width: 2,
                  )
                )
              ),
              // 设置按钮大小
              minimumSize: MaterialStateProperty.all(Size(200, 100)),
              // 设置水波纹的颜色
              overlayColor: MaterialStateProperty.all(Colors.purple),
            )
          ),
          OutlinedButtonTheme(
            data: OutlinedButtonThemeData(
              style: ButtonStyle(
                overlayColor: MaterialStateProperty.all(Colors.red),
              )
            ), 
            child: OutlinedButton(
              onPressed: () {
                print('点击 OutlinedButton');
              }, 
              onLongPress: () {
                print('长按 OutlinedButton');
              },
              child: Text('轮廓按钮'),
              style: ButtonStyle(
                overlayColor: MaterialStateProperty.all(Colors.blue),
              )
            )
          ),
          // 图标按钮
          IconButton(
            icon: Icon(Icons.add_alarm), 
            onPressed: () {
              print('IconButton');
            },
            color: Colors.red,
            splashColor: Colors.lightBlue,
            highlightColor: Colors.purple,
            tooltip: "怎么了",
          ),
          TextButton.icon(
            icon: Icon(Icons.add_circle),
            label: Text('文本按钮'),
            onPressed: () {

            },
          ),
          ElevatedButton.icon(
            icon: Icon(Icons.add_circle),
            label: Text('凸起按钮'),
            onPressed: () {
              
            },
          ),
          OutlinedButton.icon(
            icon: Icon(Icons.add_circle),
            label: Text('轮廓按钮'),
            onPressed: () {
              
            },
          ),
          // 按钮组
          Container(
            color: Colors.pink[100],
            width: double.infinity,
            child: ButtonBar(
              children: [
                ElevatedButton(
                  onPressed: (){}, 
                  child: Text('按钮一'),
                ),
                ElevatedButton(
                  onPressed: (){}, 
                  child: Text('按钮二'),
                ),
                ElevatedButton(
                  onPressed: (){}, 
                  child: Text('按钮二'),
                ),
                ElevatedButton(
                  onPressed: (){}, 
                  child: Text('按钮二'),
                ),
                ElevatedButton(
                  onPressed: (){}, 
                  child: Text('按钮二'),
                ),
              ],
            )
          ),
          BackButton(
            color: Colors.red,
            onPressed: () {},
          ),
          CloseButton(
            color: Colors.red,
            onPressed: () {},
          ),
        ],
      )
    );
  }
}

效果:在这里插入图片描述

十四、图片

  • Image.asset (加载本地图片)
    • Flutter 项目下,创建图片存储目录
    • 在 pubspec.yaml 中的 flutter 部分添加图片配置
    • 在代码中加载图片

在这里插入图片描述

  • Image.network (加载网络图片)保证网络畅通
    • 设置网络访问权限
    • 允许 http 协议访问
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Image"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: ImageDemo()
    );
  }
}

class ImageDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Column(
      children: [
        // 加载本地图片
        Image.asset(
          'images/bg1.jpg',
          width: 200,
          height: 200,
          fit: BoxFit.fill,
        ),
        // 加载网络图片
        Image.network(
          'http://cdn.cnbj1.fds.api.mi-img.com/mi-mall/5a260090e0e08770b0bd865845a4b4ab.jpg',
          repeat: ImageRepeat.repeat,
          colorBlendMode: BlendMode.colorDodge,
          color: Colors.green,
        ),
      ],
    );
  }
}

在这里插入图片描述

十五、列表-SingleChildScrollView

  • SingleChildScrollView (类似Android中的 ScrollView)
    • child (子组件)
    • padding (内边距)
    • scrollDirection (滚动方向: Axis.horizontal | Axis.vertical)
    • reverse(初始滚动位置,false 头部、true 尾部)
    • physics
      • ClampingScrollPhysics: Android 下微光效果
      • BouncingScrollPhysics: ios 下弹性效果
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("SingleChildScrollView"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: SingleChildScrollViewDemo()
    );
  }
}

class SingleChildScrollViewDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Stack(
      children: [
        // 验证水平滚动
        SingleChildScrollView(
          scrollDirection: Axis.horizontal,
          padding: EdgeInsets.all(10),
          reverse: true,
          child: Row(
            children: [
              OutlinedButton(
                onPressed: () {},
                child: Text('按钮一')
              ),
              OutlinedButton(
                onPressed: () {},
                child: Text('按钮二')
              ),
              OutlinedButton(
                onPressed: () {},
                child: Text('按钮三')
              ),
              OutlinedButton(
                onPressed: () {},
                child: Text('按钮四')
              ),
              OutlinedButton(
                onPressed: () {},
                child: Text('按钮五')
              ),
              OutlinedButton(
                onPressed: () {},
                child: Text('按钮六')
              ),
            ]
          ),
        ),
        // 垂直方向的滚动
        SingleChildScrollView(
          scrollDirection: Axis.vertical,
          padding: EdgeInsets.all(10),
          reverse: true,
          physics: BouncingScrollPhysics(),
          child: Column(
            children: List.generate(
              100, 
              (index) => OutlinedButton(
                onPressed: () {},
                child: Text('按钮$index')
              ),
            )
          ),
        )
      ],
    );
  }
}

在这里插入图片描述

十六、列表-ListView

  • ListView
    • 加载列表的组件(加载所有 Widgets,适用 Widget 较少的场景)
    • ListTile (leading、 title、 subtitle、 trailing、 selected)
  • ListView.builder
    • 按需加载 Widget,性能比默认构造函数高,适用 Widget 较多的场景
  • ListView.separated
    • 比 ListView.builder 多了分隔器
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("ListView"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: ListViewDemo()
    );
  }
}

class ListViewDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        children: [
          ListViewBasic(),
          ListViewHorizontal(),
          ListViewBuilderDemo(),
          ListViewSeperatedDemo(),
        ]
      )
    );
  }
}

class ListViewBasic extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      height: 200,
      child: ListView(
        scrollDirection: Axis.vertical,
        children: [
          ListTile(
            leading: Icon(Icons.access_alarm, size: 50),
            title: Text('access_alarm'),
            subtitle: Text('子标题'),
            trailing: Icon(Icons.keyboard_arrow_right),
          ),
          ListTile(
            leading: Icon(Icons.ac_unit, size: 50),
            title: Text('ac_unit'),
            subtitle: Text('子标题'),
            trailing: Icon(Icons.keyboard_arrow_right),
            selected: true,
            selectedTileColor: Colors.red[100],
          ),
          ListTile(
            leading: Icon(Icons.add_photo_alternate_rounded, size: 50),
            title: Text('add_photo_alternate_rounded'),
            subtitle: Text('子标题'),
            trailing: Icon(Icons.keyboard_arrow_right),
          ),
          ListTile(
            leading: Icon(Icons.fact_check_outlined, size: 50),
            title: Text('fact_check_outlined'),
            subtitle: Text('子标题'),
            trailing: Icon(Icons.keyboard_arrow_right),
          ),
        ]
      )
    );
  }
}

class ListViewHorizontal extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      height: 100,
      child: ListView(
        scrollDirection: Axis.horizontal,
        children: [
          Container(
            width: 160,
            color: Colors.amber,
          ),
          Container(
            width: 160,
            color: Colors.blueAccent,
          ),
          Container(
            width: 160,
            color: Colors.black87,
          ),
          Container(
            width: 160,
            color: Colors.grey,
          ),
        ],
      )
    );
  }
}

class ListViewBuilderDemo extends StatelessWidget {
  final List<Widget> users = new List<Widget>.generate(20, (index) => OutlinedButton(
    onPressed: () {}, 
    child: Text('姓名 $index')
  ));

  
  Widget build(BuildContext context) {
    return Container(
      height: 150,
      child: ListView.builder(
        itemCount: users.length,
        itemExtent: 30,
        padding: EdgeInsets.all(10),
        itemBuilder: (context, index) {
          return users[index];
        },
      )
    );
  }
}

class ListViewSeperatedDemo extends StatelessWidget {
  final List<Widget> products = List.generate(20, (index) => ListTile(
    leading: Image.asset('images/flutter.jpg'),
    title: Text('商品标题 $index'),
    subtitle: Text('子标题'),
    trailing: Icon(Icons.keyboard_arrow_right),
  ));

  
  Widget build(BuildContext context) {
    Widget dividerOdd = Divider(
      color: Colors.blue,
      thickness: 2
    );

    Widget dividerEven = Divider(
      color: Colors.red,
      thickness: 2
    );

    return Column(
      children: [
        ListTile(
          title: Text('商品列表'),
        ),
        Container(
          height: 200,
          child: ListView.separated(
            itemCount: products.length,
            itemBuilder: (context, index) {
              return products[index];
            },
            // 分隔器的构造器
            separatorBuilder: (context, index) {
              return index%2 == 0 ? dividerEven : dividerOdd;
            },
          )
        ),
      ],
    );
  }
}

效果:在这里插入图片描述

十七、列表-GridView-上

  • GridView (网格布局)
    • children (子组件)
    • scrollDirection (滚动方向)
    • gridDelegate
      • SliverGridDelegateWithFixedCrossAxisCount (指定列数- 子组件宽度自适应)
      • SliverGridDelegateWithMaxCrossAxisExtent (指定子组件宽度 - 列数自适应)
  • GridView.count (列数固定)
  • GridView.extend (子组件宽度固定)
  • GridView.builder (动态网格布局)
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("GridView"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: GridViewDemo()
    );
  }
}

class GridViewDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(10),
      child: 
      // GridView(
      //   gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
      //     crossAxisCount: 2, // 指定列数
      //     mainAxisSpacing: 20, // 主轴方向的间距
      //     crossAxisSpacing: 10, // 交叉轴的间距
      //     childAspectRatio: 1.5, // 子组件的宽高比例
      //   ),
      //   children: [
      //     Container(color: Colors.tealAccent),
      //     Container(color: Colors.amberAccent),
      //     Container(color: Colors.redAccent),
      //     Container(color: Colors.blueGrey),
      //     Container(color: Colors.purpleAccent),
      //     Container(color: Colors.lightGreenAccent),
      //     Container(color: Colors.lightGreen),
      //     Container(color: Colors.black54),
      //     Container(color: Colors.yellowAccent),
      //     Container(color: Colors.grey),
      //     Container(color: Colors.deepOrangeAccent),
      //   ],
      // ),
      GridView(
        gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
          maxCrossAxisExtent: 190, // 子组件的宽度
          mainAxisSpacing: 30,
          crossAxisSpacing: 10,
          childAspectRatio: 0.8,
        ),
        children: [
          Container(color: Colors.tealAccent),
          Container(color: Colors.amberAccent),
          Container(color: Colors.redAccent),
          Container(color: Colors.blueGrey),
          Container(color: Colors.purpleAccent),
          Container(color: Colors.lightGreenAccent),
          Container(color: Colors.lightGreen),
          Container(color: Colors.black54),
          Container(color: Colors.yellowAccent),
          Container(color: Colors.grey),
          Container(color: Colors.deepOrangeAccent),

        ],
      )
    );
  }
}

效果:在这里插入图片描述

十八、列表-GridView-下

import 'package:flutter/material.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("GridView"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: GridViewBuilderDemo()
    );
  }
}

class GridViewCountDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      child: GridView.count(
        children: List.generate(10, (index) => 
          Image.asset('images/flutter.jpg')
        ),
        crossAxisCount: 2,
        mainAxisSpacing: 20,
        crossAxisSpacing: 20,
        padding: EdgeInsets.symmetric(horizontal: 40),
        childAspectRatio: 1.5,
      ),
    );
  }
}

class GridViewExtendDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      child: GridView.extent(
        children: List.generate(10, (index) => 
          Image.asset('images/flutter.jpg')
        ),
        maxCrossAxisExtent: 100, // 子组件的宽度
        mainAxisSpacing: 20,
        crossAxisSpacing: 20,
        padding: EdgeInsets.symmetric(horizontal: 40),
        // childAspectRatio: 1.5,
      ),
    );
  }
}

class GridViewBuilderDemo extends StatelessWidget {
  final List<dynamic> _tiles = [
    Container(color: Colors.tealAccent),
    Container(color: Colors.amberAccent),
    Container(color: Colors.redAccent),
    Container(color: Colors.blueGrey),
    Container(color: Colors.purpleAccent),
    Container(color: Colors.lightGreenAccent),
    Container(color: Colors.lightGreen),
    Container(color: Colors.black54),
    Container(color: Colors.yellowAccent),
    Container(color: Colors.grey),
    Container(color: Colors.deepOrangeAccent),
  ];

  
  Widget build(BuildContext context) {
    return Container(
      child: GridView.builder(
        padding: EdgeInsets.symmetric(horizontal: 40),
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          mainAxisSpacing: 20,
          crossAxisSpacing: 20,
          childAspectRatio: 1.0
        ),
        itemCount: _tiles.length,
        itemBuilder: (context, index) {
          return _tiles[index];
        },
        physics: BouncingScrollPhysics(), // 反弹效果
        // physics: ClampingScrollPhysics(), // 夹住的效果
        // physics: AlwaysScrollableScrollPhysics(), // 滚动
        // physics: NeverScrollableScrollPhysics(), // 禁止滚动
      ),
    );
  }
}

十九、其他-Cupertino- ios风格组件

  • Material
    • 安卓风格的组件
    • import ‘package:flutter/material.dart’;
  • Cupertino
    • ios 风格的组件
    • import ‘package:flutter/cupertino.dart’;
    • https://flutter.dev/docs/development/ui/widgets/cupertino
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'dart:io';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Cupertino"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: MyBody()
    );
  }
}

class MyBody extends StatelessWidget {
  
  Widget build(BuildContext context) {
    Widget dialogBox;
    // 判断当前的平台信息
    if (Platform.isIOS) {
      // 加载 iOS 风格的组件
      dialogBox = CupertinoDemo();
    } else if (Platform.isAndroid) {
      // 加载 Android 风格的组件
      dialogBox = MaterialDemo();
    }

    return Container(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: [
          // 安装风格的组件
          Text('Material - 安卓风格'),
          MaterialDemo(),

          // iOS 风格的组件
          Text('Cupertino - iOS 风格'),
          CupertinoDemo()
        ]
      )
    );
  }
}

class MaterialDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      child: AlertDialog(
        title: Text('提示'),
        content: Text('确认删除吗?'),
        actions: [
          TextButton(
            child: Text('取消'),
            onPressed: () {
              print('取消的逻辑');
            }
          ),
          TextButton(
            child: Text('确认'),
            onPressed: () {
              print('确认的逻辑');
            }
          ),
        ]
      )
    );
  }
}

class CupertinoDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(
      child: CupertinoAlertDialog(
        title: Text('提示'),
        content: Text('确认删除吗?'),
        actions: [
          CupertinoDialogAction(
            child: Text('取消'),
            onPressed: () {
              print('取消的逻辑');
            }
          ),
          CupertinoDialogAction(
            child: Text('确认'),
            onPressed: () {
              print('确认的逻辑');
            }
          )
        ],
      )
    );
  }
}

在这里插入图片描述

二十、SafeArea

  • SafeArea可以有效解决异形屏幕的问题(刘海屏)

在这里插入图片描述

二十一、第三方组件-dio

  • dio
  • flutter-swiper
  • shared_preferences

dio

  • dio 是一个强大的 Dart Http 请求库(类似 axios)
    • https://pub.dev/packages/dio
  • 使用步骤
    • 在 pubsepc.yaml 中添加 dio 依赖
    • 安装依赖(pub get | flutter packages get | VS Code 中保存配置,自动下载)
    • 引入 import ‘package:dio/dio.dart’;
    • 使用:https://pub.dev/documentation/dio/latest/

get请求:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Dio"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: DioDemo()
    );
  }
}

class DioDemo extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        child: Text('点击发送请求'),
        onPressed: () {
          // 调用 HTTP 请求
          getIpAddress();
        }
      ),
    );
  }

  void getIpAddress() async {
    try {
      final url = "https://httpbin.org/ip";
      Response response = await Dio().get(url);
      String ip = response.data['origin'];
      print(ip);
    } catch (e) {
      print(e);
    }
  }
}

二十二、Flutter_swiper

  • Flutter 中最好的轮播组件,适配 Android 和 iOs
    • https://pub.dev/packages/flutter_swiper
  • 使用步骤
    • 在 pubsepc.yaml 中添加 flutter_swiper 依赖
    • 安装依赖(pub get | flutter packages get | VS Code 中保存配置,自动下载)
    • 引入 import ‘package:flutter_swiper/flutter_swiper.dart’;
    • 使用
import 'package:flutter/material.dart';
import 'package:flutter_swiper/flutter_swiper.dart';

class Home extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("flutter_swiper"),
        leading: Icon(Icons.menu),
        actions: [
          Icon(Icons.settings)
        ],
        elevation: 0.0,
        centerTitle: true,
      ),
      body: FlutterSwiperDemo()
    );
  }
}

class FlutterSwiperDemo extends StatelessWidget {
  final List<String> imgs = [
    'images/1.jpg',
    'images/2.jpg',
    'images/3.jpg',
  ];

  
  Widget build(BuildContext context) {
    return ListView(
      children: [
        Container(
          height: 200,
          child: Swiper(
            itemCount: imgs.length,
            itemBuilder: (context, index) {
              return Image.asset(
                imgs[index],
                fit: BoxFit.cover
              );
            },
            pagination: SwiperPagination(), // 轮播图的指示点
            control: SwiperControl(),// 左右箭头导航
          ),
        ),
        Container(
          height: 200,
          child: Swiper(
            itemCount: imgs.length,
            itemBuilder: (context, index) {
              return Image.asset(
                imgs[index],
                fit: BoxFit.cover
              );
            },
            viewportFraction: 0.7,
            scale: 0.7,
          ),
        ),
        Container(
          height: 200,
          child: Swiper(
            itemCount: imgs.length,
            itemBuilder: (context, index) {
              return Image.asset(
                imgs[index],
                fit: BoxFit.cover
              );
            },
            itemWidth: 300,
            layout: SwiperLayout.STACK,
          ),
        ),
        Container(
          height: 200,
          child: Swiper(
            itemCount: imgs.length,
            itemBuilder: (context, index) {
              return Image.asset(
                imgs[index],
                fit: BoxFit.cover
              );
            },
            itemWidth: 300,
            itemHeight: 200,
            layout: SwiperLayout.TINDER,
          ),
        )
      ],
    );
  }
}

在这里插入图片描述

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

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

相关文章

【VScode技巧】:platformio部署ESP32Cam开发板

学习目标&#xff1a; 前几天用Arduino开发了ESP32Cam&#xff0c;实现了人脸识别的功能&#xff0c;今天无聊想了想ESP32Can也可以在VScode的Platformio中使用&#xff0c;于是就试着配置了一下。以下是配置环境的过程&#xff0c;谢谢大家观看。 正所谓工欲善其事&#xff0c…

【零基础】学python数据结构与算法笔记10

文章目录前言57.链表介绍58.链表的创建和遍历59.链表的插入和删除60.双链表61.链表总结62.哈希表62.哈希表实现64.哈希表应用总结前言 学习python数据结构与算法&#xff0c;学习常用的算法&#xff0c; b站学习链接 57.链表介绍 链表是由一系列节点组成的元素集合。每个节点…

React配置文件(五) 配置less

代码如下: module.exports { webpack: override( addLessLoader({ lessOptions: { javascriptEnabled: true, modifyVars: { primary-color: #1DA57A }, }, }), adjustStyleLoaders(({ use: [, , postcss] }) > { const postcssOptions postcss.options postcss.options …

SEO初学者如何快速做好 SEO 优化?seo数据查询

昨天给大家介绍了seo的意义和重要性&#xff0c;今天让我们一起看看10个基本的SEO初学者技巧&#xff0c;如何优化网站以增加流量。 1. 研究关键词并使用尾词 关键词在SEO中起着重要的作用。关键字表明了你文章的主要主题&#xff0c;它使人们有可能在网上搜索感兴趣的主题时找…

RK3588平台开发系列讲解(日志篇)RK3588 syslog的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查看是否启用syslog.conf二、配置启用syslog.conf1、配置busybox2、添加配置文件3、编译buildroot烧录三、验证1、编写测试代码2、查看日志文件3、运行测试程序沉淀、分享、成长,让自己和他人都能有所收获!😄 …

SpringCloudAlibaba入门(2023版)

先知 架构图一览 创建Serve端 新建项目 配置文件 application.yaml server:port: 8080# Eureka配置 eureka:instance:## Eureka实例的名称hostname: localhostAclient:# false表示自己端就是注册中心&#xff0c;职责就是维护服务实例&#xff0c;并不需要去检查服务fetch-r…

Kafka-eagle 安装教程

参考资料&#xff1a; 参考视频 Kafka-eagle官网 解释&#xff1a;Kafka-eagle 后来更名为 EFAK &#xff0c;所以打开官网会显示EFAK 环境准备&#xff1a; 要有本服务器可访问的MySQL服务&#xff0c;远程的请检查是否已经开启了MySQL远程访问&#xff0c;如果没有则需…

1.12 PWM实验

蜂鸣器--------TIM4 CH1/PB6 风扇-----------TIM1 CH1/PE9 马达-----------TIM16 CH1/PF6 一.PWM框图 RCC&#xff1a;使能GPIOB GPIOB&#xff1a;设置复用功能 TIM4:产生方波 二.分析RCC 确定总线&#xff0c;使能GPIOB和TIM4&#xff0c;GPIOE和TIM1,GPIO和TIM16 三.分…

【C++11】右值引用和移动语义

目录 一、左值 vs 右值 二、左值引用vs 右值引用 三、右值引用使用场景和意义 1. 左值引用的使用场景 2. 左值引用的短板 3. 右值引用和移动语义解决上述问题 四、右值引用引用左值的使用场景 五、完美转发 1. 模板中的&& 万能引用 2. std::forward 完美转发…

windows排查问题常用命令

查看JAVA进程占用PID: wmic process where caption"java.exe" get processid,caption,commandline /value查看进程端口信息&#xff1a;netstat -ano 或者 netstat -ano|findstr "8080" 或查看成功建立连接的&#xff1a;netstat -ano | findstr “ESTABLI…

C语言中的字符指针

目录1.字符指针指向一个字符2.字符指针指向一个字符串3.例题1.字符指针指向一个字符 int main() {char ch w;char *pc &ch;return 0; }将一个char类型的变量的地址放到一个char*类型的指针里去&#xff0c;这里的char*ps就是字符指针 在这里的字符指针与之前的整形指针等…

巧用gitbash的scp命令实现跨网段的文件直传

背景 嵌入式开发的工作流一般是这样的&#xff0c;程序员通过Windows电脑登陆Linux服务器&#xff0c;在服务器上编译出二进制文件后&#xff0c;先将文件scp到本地&#xff0c;然后再scp到Linux开发板&#xff0c;如下图所示 这样做需要执行两次scp命令&#xff0c;能否只执…

Golang cgo:如何在Go代码中调用C语言代码?

如何在Go代码中调用C语言代码&#xff1f; Go语言是通过自带的一个叫CGO的工具来支持C语言函数调用&#xff0c;同时我们可以用Go语言导出C动态库接口给其它语言使用。 方式一、直接在 Go 代码中写入 C 代码 检查是否开启cgo工具 首先&#xff0c;要查看是否已经开启cgo工具…

树状数组+例题

一、树状数组的定义 树状数组 或 二元索引树&#xff08;Binary Indexed Tree&#xff09;&#xff0c;现多用于高效计算数列的前缀和&#xff0c; 区间和。它可以以 log(n)log(n)log(n) 的时间得到任意前缀和&#xff0c;也支持在log(n)log(n)log(n)时间内支持动态单点值的修改…

Spring简介与使用

什么是spring spring是一个开源的框架&#xff0c;里面有一系列功能&#xff0c;可以使我们的开发变得更为轻松 简单来说&#xff0c;spring是包含众多工具方法的IoC容器 所谓容器&#xff0c;就是盛放东西的事务&#xff0c;例如我们的ArrayList就是数据存储的容器&#xff…

数据库——排序与分页

目录 排序数据 单列排序 多列排列 分页 分页原理 优点 MySQL 8.0新特性 排序数据 使用 ORDER BY 子句排序ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序ORDER BY 子句在SELECT语句的结尾。 单列排序 SELECT employee_id,last_name…

【Linux】项目自动化构建工具-make与Makefile的简单使用(模拟实现进度条)

目  录1 make与Makefile使用2 模拟实现进度条前言&#xff1a; 会不会编写Makefile&#xff0c;从侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计其数&#xff0c;按类型、功能、模块分别放在若干个目录中&#xff0c;Makefile定义了一系列的规则来指定…

使用 EMQX Cloud 桥接数据到 GCP Pub/Sub

前不久&#xff0c;Google 宣布其旗下的 GCP IoT Core 即将在 2023 年 8 月 16 日停止提供服务。这意味着大量使用 GCP IoT Core 的用户可能需要将他们的 IoT 应用迁移到其他物联网云服务。除了云服务的迁移&#xff0c;很多用户也在直接利用谷歌云生态&#xff0c;使用 GCP 上…

Docker部署 Harbor

系列文章目录 Docker部署 registry Docker搭建 svn Docker部署 Harbor Docker 部署SQL Server 2017 Docker 安装 MS SqlServer Docker部署 Oracle12c Docker部署Jenkins Docker部署 Harbor系列文章目录前言一、Harbor安装有3种方式二、安装步骤1. 从github官方地址下载安装包2…

C/C++尖括号和双引号包含头文件的区别

前言头文件有两种包含方式&#xff0c;一种是使用尖括号<>&#xff0c;另外一种是通过双引号""包含&#xff0c;例如&#xff1a;#include <iostream> #include "add.h"那么今天就专门来聊一聊这两种方式的区别。1.头文件的含义不同使用尖括号…