flutter 基础组件学习

文章目录


flutter 项目结构

当我们创建项目的时候,flutter自动帮我们创建一些东西。

我们重点只需要关注两个

第一个是lib,项目的主要源代码目录

第二个是pubspec.yml ,也就是项目依赖和配置文件(类比python的requestments.txt go 语言的go.mod)

其他的,如果上过班的话,应该也清楚是什么,这里就简单说一下

build 是存放构建产物的目录,比如exe,就是编译过后可运行的文件

test 就是存放代码测试的目录,一般是公司要求编写单测

.gitignore 学过git 的应该都知道吧,要求git 在add 的时候,忽略的文件或目录

runapp 和 widget

runapp 函数 是 flutter 内部提供的一个函数,我个人理解是程序的启动入口

flutter 中 万物皆widget

什么都是widget

基础组件--material App

material 是 官方出的UI 库,整个 app 都被 material app 包裹

本节我们学到了三个常用属性

title:用来设置 网页的名称

theme: ThemeData(scaffoldBackgroundColor: Colors.pinkAccent),

用来设置 主题的颜色,需要注意,如果home 没有设置的话,这个颜色是不会显示出来的

home 就是用来展示窗口的主体内容的。

dart 复制代码
import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MaterialApp(
    title: "Flutter 组建初体验",
    theme: ThemeData(scaffoldBackgroundColor: Colors.pinkAccent),
    home: Scaffold(
      body: const Center(
        child: Text("Hello World!"),
      ),
    ),
  ));
}

基础组件- scaffold

scaffold 是 页面骨架,常用的就是三个widget

分别是 appBar,body,bottomNavigationBar

appBar 就是页面的头部区域,这部分我们可以AppBar 来进行设置

body 就是 身体,也就是页面的中部区域,我们这里使用containter 容器,后面会进行讲解

bottimNavigationBar 就是 页面的底部

本节还讲了

Centor ,用于让组件处于居中的位置

Text,文本组件

height,设置 容器高度

需要注意,bottomNavigationBar 需要设置一下高度,不然会被body 给挤掉。

还有就是 ,使用win 的话,会发现 头部区域的文字是右对齐 的,这个应该是win和mac平台不同造成的。

dart 复制代码
import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MaterialApp(
    title: "flutter 初体验",
    // theme: ThemeData(scaffoldBackgroundColor: Colors.deepOrange),
    home: Scaffold(
      appBar: AppBar(
        title: Text("头部区域"),
      ),
      body: Center(
        child: Text("中部区域"),
      ),
      bottomNavigationBar: SizedBox(
        height: 80,
        child: Center(
          child: Text("底部区域"),
        ),
      ),
    ),
  ));
}

自定义组件

自定义组件分为有状态组件和有状态组件,区别如下

无状态组件

无状态组件 简单来说就是不能动的,纯展示型组件,没有用户交互操作

自己实现一个无状态组件,也是挺简单的

只需要 创建一个新的类,继承Statelesswidget 类 并实现build 方法

dart 复制代码
import 'package:flutter/material.dart';

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

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "flutter 初体验",
      theme: ThemeData(scaffoldBackgroundColor: Colors.deepOrange),
      home: Scaffold(
        appBar: AppBar(
          title: Text("头部区域"),
        ),
        body: Container(
          child: Center(
            child: Text("中部区域"),
          ),
        ),
        bottomNavigationBar: Container(
          height: 80,
          child: Container(
            child: Center(
              child: Text("底部区域"),
            ),
          ),
        ),
      ),
    );
  }
}

有状态组件

有状态组件 跟无状态组件,我觉得最大的区别在于,有一个类负责管理所有可变的数据和业务逻辑,其他跟无状态组件,感觉区别不是很大。

dart 复制代码
import 'package:flutter/material.dart';

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

class MainPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MainPageState();
  }

}

class _MainPageState extends State<MainPage> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "flutter 有状态组件",
      theme: ThemeData(scaffoldBackgroundColor: Colors.deepOrange),
      home: Scaffold(
        appBar: AppBar(
          title: Text("头部区域"),
        ),
        body: Container(
          child: Center(
            child: Text("中部区域"),
          ),
        ),
        bottomNavigationBar: Container(
          height: 80,
          child: Container(
            child: Center(
              child: Text("底部区域"),
            ),
          ),
        ),
      ),
    );
  }
  }

快捷键快速创建 无状态组件 和 有状态组件

idea 的快捷键,跟vscode 里面的快捷键 ,有一点不同,

无状态组件快捷键:stless

有状态组件快捷键:stful

下面这个是vscode 的快捷键

生命周期-无状态组件

无状态组件的唯一阶段就是 build 方法

当组件被创建或父组件状态变化 导致其需要重新构建时,build方法 会被调用

生命周期- 有状态组件

可以跑一下代码试一下,

dart 复制代码
import 'package:flutter/material.dart';

void main() {
  runApp(TestWidget());


}

class TestWidget extends StatefulWidget {
  const TestWidget({super.key});

  @override
  State<TestWidget> createState() {
    print("create state 阶段");
    return _TestWidgetState();
  }

}

class _TestWidgetState extends State<TestWidget> {
  @override
  void initState() {
    print("init state 阶段");
    // TODO: implement initState
    super.initState();
  }
  @override
  void didChangeDependencies() {
    print("didChangeDependencies 阶段");
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
  }

  @override
  void deactivate() {
    // TODO: implement deactivate
    print("deactivate 阶段");
    super.deactivate();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    print("dispose 阶段");
    super.dispose();
  }


  @override
  void didUpdateWidget(covariant TestWidget oldWidget) {
    // TODO: implement didUpdateWidget
    print("didUpdateWidget 阶段");
    super.didUpdateWidget(oldWidget);
  }

  @override
  Widget build(BuildContext context) {
    print("build 阶段");
    return const Placeholder();
  }
}

点击事件-GestureDetector

GestureDetector 是手势检测组件

可以使用该组件 的 onTap 方法 来实现单击事件的触发,onDoubleTap 就是双击事件,可以试一下下面的代码

dart 复制代码
import 'package:flutter/material.dart';

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

class MainPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MainPageState();
  }

}

class _MainPageState extends State<MainPage> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "flutter 有状态组件",
      theme: ThemeData(scaffoldBackgroundColor: Colors.deepOrange),
      home: Scaffold(
        appBar: AppBar(
          title: Text("头部区域"),
        ),
        body: Container(
          child: Center(
            child: GestureDetector(
              // onTap: (){
              //   print("点击了该区域");
              // },
              onDoubleTap: (){
                print("双击了该区域");
              },
              child: Text("中部区域"),
            ),
          ),
        ),
        bottomNavigationBar: Container(
          height: 80,
          child: Container(
            child: Center(
              child: Text("底部区域"),
            ),
          ),
        ),
      ),
    );
  }
}

事件-组件点击事件

flutter 还提供其他的组件,来进行点击交互

dart 复制代码
import 'package:flutter/material.dart';

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

class MainPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MainPageState();
  }

}

class _MainPageState extends State<MainPage> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "flutter 有状态组件",
      theme: ThemeData(scaffoldBackgroundColor: Colors.deepOrange),
      home: Scaffold(
        appBar: AppBar(
          title: Text("头部区域"),
        ),
        body: Container(
          child: Center(
            child: TextButton(onPressed: (){
              print("点击了该区域");
            }, child: Text("按钮"))
            ),
          ),
        bottomNavigationBar: Container(
          height: 80,
          child: Container(
            child: Center(
              child: Text("底部区域"),
            ),
          ),
        ),
      ),
    );
  }
}

状态更新-setState

当数据变化,需要更新ui视图的时候,需要执行setState 方法,setState 造成build 方法的重新执行。

相关推荐
Amazing_Cacao8 小时前
深度观察 | 从“产区玄学”到“液态战场”:精品巧克力的终极试金石
学习
深蓝海拓9 小时前
S7-1500PLC学习笔记:MOVE_BLK、MOVE_BLK_VARIANT、BLKMOV的区别
笔记·学习·plc
darkhorsefly10 小时前
玩24算的益处
学习·游戏·24算
芙莉莲教你写代码11 小时前
Flutter 框架跨平台鸿蒙开发 - 考试倒计时
flutter·华为·harmonyos
深蓝海拓11 小时前
S7-1500学习笔记:用户自定义数据类型(UDT)
笔记·学习·plc
罗罗攀12 小时前
PyTorch学习笔记|神经网络的损失函数
人工智能·pytorch·笔记·神经网络·学习
aP8PfmxS212 小时前
从零学习Kafka:数据存储
分布式·学习·kafka
AI成长日志13 小时前
【算法学习专栏】动态规划基础·中等两题精讲(198.打家劫舍、322.零钱兑换)
学习·算法·动态规划
arvin_xiaoting14 小时前
OpenClaw学习总结_III_自动化系统_1:Hooks详解
运维·学习·自动化
杜子不疼.14 小时前
Java 智能体学习避坑指南:3 个常见误区,新手千万别踩,高效少走弯路
java·开发语言·人工智能·学习