Flutter学习笔记

WEB转Flutter基础学习笔记(内含vue和flutter对比) 笔者是一名web前端,记录在转栈flutter时的学习笔记,内涵和vue的对比,能够辅助前端同学更容易理解flutter 阅读详情

此篇文章用来记录学习Flutter 和 Dart 相关知识


零.Dart基本数据类型

Dart 是一种静态类型的编程语言,它提供了一系列基本数据类型,用于存储和操作不同种类的数据。以下是 Dart 中的一些基本数据类型以及它们的详细介绍:

1. 整数类型(Integer):

Dart 提供了两种整数类型:int 和 num。
int 表示整数,可以存储正数、负数和零。
num 是 int 和 double 的超类型,可以用来表示整数和浮点数。

int age = 30;
num temperature = 98.6;

2. 浮点数类型(Double):

Dart 中的浮点数类型为 double,用于表示带有小数点的数值。

double pi = 3.14159;

3.字符串类型(String):

字符串类型用于表示文本数据。
字符串可以由单引号或双引号包围。

String greeting = 'Hello, Dart!';

4.布尔类型(Boolean):

布尔类型只有两个值:true 和 false,用于表示逻辑真值和假值。

bool isDartFun = true;

5.列表类型(List):

列表是有序的数据集合,可以包含不同类型的元素。
列表使用方括号 [] 定义,并可以通过索引访问元素。

List<int> numbers = [1, 2, 3, 4, 5];

6.映射类型(Map):

映射是一组键值对的集合,其中每个键都与一个值相关联。
映射使用大括号 {} 定义。

Map<String, int> grades = {'Alice': 90, 'Bob': 85, 'Carol': 92};

7.符号类型(Symbol):
符号类型用于表示运行时的标识符或运算符。
符号使用 # 符号前缀定义。

Symbol mySymbol = #myIdentifier;

8.空类型(Null):

Dart 有一个特殊的数据类型 Null,表示一个空值或缺失值。
在非空安全(null-safe)的 Dart 中,所有的变量默认都不可以为 null,需要使用 ? 明确标记为可为 null。

String? nullableString = null; // 可为 null 的字符串

9.动态类型(Dynamic):

dynamic 是 Dart 中的一个特殊类型,可以存储任意类型的数据。
使用 dynamic 声明的变量可以在运行时改变其类型。

dynamic dynamicVariable = 42;
dynamicVariable = 'Hello';

这些是 Dart 中的一些基本数据类型。Dart 还支持更多高级数据类型,例如函数、类、枚举等,以便更灵活地处理各种数据和逻辑。此外,Dart 2.12 引入了非空安全(null safety)功能。
注意
Dart 中没有专门的字节数据类型,而是使用 int 来表示字节值,因为 Dart 的整数类型 int 可以存储 8 位的无符号整数,正好对应一个字节。如果你需要表示多个字节的数据,可以使用列表 (List) 或字节数组 (Uint8List,通常需要导入 dart:typed_data 库)。

一.Dart 一些语法

const:关键字,用于声明一个编译时常量

变量声明
const int x = 5;

构造函数: 用于声明一个可以在编译时确定值的常量构造函数。
class MyClass {
  final int value;
  const MyClass(this.value);
}

数组和映射字面量: 可以用 const 声明编译时常量的数组和映射。
const List<int> numbers = [1, 2, 3];
const Map<String, int> scores = {'John': 100, 'Jane': 90};

继承关系
dart有三种方式,分别是extends(继承),with(混入) ,implements(实现),三种可以混合使用,其中with,implements后可以多继承,用逗号隔开,extends后面只能跟一个,优先级顺序为with>extends>implements,当with,implements后跟了多个的时候,优先级最右边大于左边,依次类推,例如extends a with b,c implements d,h,优先级为c>b>a>h>d;

函数可选参数
与java不同,dart中不支持重载,java支持方法重载,dart想要实现java类似的效果,可以通过可选参数来实现

selectFunction("张三");
selectFunction("李四",type: 1);
selectFunction("王五",type: 1,money: 83.2);

void selectFunction(String name,{int? type,double? money}){
  print("名字:$name--类型:$type--金额:$money");
}
//注意dart可选参数必须要加?来表示该参数默认值为null,如果去掉?可以手动写个默认值,例如
void selectFunction(String name,{int type = 0,double? money}){
  print("名字:$name--类型:$type--金额:$money");
}
//输出结果:名字:张三--类型:null--金额:null
//名字:李四--类型:1--金额:null
//名字:王五--类型:1--金额:83.2


二.Flutter 中的一些常用Widget详解

本文只是个别常用介绍,关于更多Widget的相关介绍看另一篇文章:Flutter 控件查阅清单

Center(居中对齐小部件):

Center小部件用于在可用空间内使其子小部件水平和垂直居中对齐。它接受一个需要居中的子小部件。Center小部件将扩展以填充父小部件的所有可用空间,并在该空间内居中其子小部件。

Center(
  child: Text(
    'Hello, Flutter!',
    style: TextStyle(fontSize: 24.0),
  ),
)

Text(文本小部件):

Text小部件用于在屏幕上显示一行文本。可以自定义文本的样式,例如字体大小、颜色和对齐方式。通过将字符串传递给Text小部件的data参数,可以设置文本的内容。

常用的Text属性:

  • data(String):要显示的文本内容。
  • style(TextStyle):定义文本的样式,如字体、大小、颜色等。
  • textAlign(TextAlign):指定文本在水平方向上的对齐方式。
    –TextAlign.left:文本左对齐。
    –TextAlign.right:文本右对齐。
    –TextAlign.center:文本居中对齐。
    –TextAlign.justify:文本两端对齐,会调整单词和字之间的间隔。
  • textDirection(TextDirection):指定文本的方向,如从左到右或从右到左。
  • textScaleFactor(double):指定文本的缩放比例。
  • maxLines(int):指定允许的最大行数,超过将使用"…"截断。
  • overflow(TextOverflow):定义文本溢出时的处理方式。
  • softWrap(bool):指定文本是否自动换行。
 body: Center(
          child: Text(
            'Hello, Flutter!',
            style: TextStyle(
              fontSize: 24,
              fontWeight: FontWeight.bold,
              color: Colors.blue,
            ),
          ),
        ),

Button(按钮)

RaisedButton 废弃

ElevatedButton (代替RaisedButton)

RaisedButton 是一个具有凸起效果的按钮,通常用于主要操作。

它具有各种自定义属性,如 onPressed、child、color、disabledColor、textColor 等,以定制外观和行为。

ElevatedButton(
  onPressed: () {
    // 处理按钮点击事件
  },
  child: Text('Click me'),
)


FlatButton

FlatButton 是一个扁平化的按钮,通常用于次要操作。

它有类似于 RaisedButton 的自定义属性,可以根据需求进行定制。

FlatButton(
  onPressed: () {
    // 按钮被点击时执行的操作
  },
  child: Text('Cancel'),
)

OutlineButton

OutlineButton 是一个带有边框的按钮,通常用于取消操作或与背景区分。

它也有类似于 RaisedButton 的自定义属性,以便自定义外观和行为。

OutlineButton(
  onPressed: () {
    // 按钮被点击时执行的操作
  },
  child: Text('Clear'),
)

FloatingActionButton

FloatingActionButton 是一个圆形的浮动操作按钮,常用于应用程序的主要操作。

它也具有各种自定义属性和样式,可以根据需求进行调整。

FloatingActionButton(
  onPressed: () {
    // 按钮被点击时执行的操作
  },
  child: Icon(Icons.add),
)

IconButton

IconButton 是一个只包含图标的按钮,通常用于具有图标表示的操作。

它也有各种自定义属性和样式,以便自定义外观和行为。

IconButton(
  onPressed: () {
    // 按钮被点击时执行的操作
  },
  icon: Icon(Icons.favorite),
)

Container(容器小部件):

Container小部件是一个多用途灵活的小部件,可以包含其他小部件。允许自定义属性,如宽度、高度、填充、边距、颜色等,以控制其子小部件的布局和外观。它还可以对子小部件应用变换、装饰和约束。

Container(
  width: 200.0,
  height: 100.0,
  color: Colors.blue,
  child: Center(
    child: Text(
      'Hello, Flutter!',
      style: TextStyle(fontSize: 24.0, color: Colors.white),
    ),
  ),
)

Row和Column(行和列小部件):

这些布局小部件用于将其子小部件按水平(Row)或垂直(Column)线排列。它们可以包含多个子小部件,并根据子小部件的属性和可用空间自动调整大小和位置。可以使用特定参数控制子小部件的对齐方式、间距和调整大小的行为。

Row小部件具有以下一些常用的属性:

  • children(List<Widget>):需要包含在Row中的子部件列表。
  • mainAxisAlignment(MainAxisAlignment):子部件在主轴方向上的对齐方式,默认是start。
  • crossAxisAlignment(CrossAxisAlignment):子部件在交叉轴方向上的对齐方式,默认是start。
  • mainAxisSize(MainAxisSize):Row在主轴方向上的大小约束,默认是MainAxisSize.max。
  • textDirection(TextDirection):子部件的文本方向,默认是TextDirection.ltr。
  • verticalDirection(VerticalDirection):子部件在垂直方向上布局的方向,默认是VerticalDirection.down。
 body: Row(
          mainAxisAlignment: MainAxisAlignment.center, // 在水平方向上居中对齐
          crossAxisAlignment: CrossAxisAlignment.start, // 在垂直方向上上对齐
          mainAxisSize: MainAxisSize.min, // 占用尽可能少的水平空间
          textDirection: TextDirection.ltr, // 子部件的文本方向从左到右
          verticalDirection: VerticalDirection.down, // 从上到下布局
          children: [
            Text(
              'First Item',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(width: 20), // 在子部件之间增加间距
            Text(
              'Second Item',
              style: TextStyle(fontSize: 24),
            ),
            Container(
              color: Colors.blue,
              width: 200,
              height: 200,
              child: Text(
                'Third Item',
                style: TextStyle(fontSize: 24, color: Colors.white),
              ),
            ),
          ],
        ),

Column小部件具有以下一些常用的属性:

  • children(List<Widget>):需要包含在Column中的子部件列表。
  • mainAxisAlignment(MainAxisAlignment):子部件在主轴方向上的对齐方式,默认是start。
  • crossAxisAlignment(CrossAxisAlignment):子部件在交叉轴方向上的对齐方式,默认是start。
  • mainAxisSize(MainAxisSize):Column在主轴方向上的大小约束,默认是MainAxisSize.max。
  • verticalDirection(VerticalDirection):子部件在垂直方向上布局的方向,默认是VerticalDirection.down。
body: Column(
          mainAxisAlignment: MainAxisAlignment.center, // 在垂直方向上居中对齐
          crossAxisAlignment: CrossAxisAlignment.start, // 在水平方向上左对齐
          mainAxisSize: MainAxisSize.min, // 占用尽可能少的垂直空间
          verticalDirection: VerticalDirection.down, // 从上到下布局
          children: [
            Text(
              'First Item',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20), // 在子部件之间增加间距
            Text(
              'Second Item',
              style: TextStyle(fontSize: 24),
            ),
            Container(
              color: Colors.blue,
              width: 200,
              height: 200,
              child: Text(
                'Third Item',
                style: TextStyle(fontSize: 24, color: Colors.white),
              ),
            ),
          ],
        ),

Image(图像小部件):

Image小部件用于在屏幕上显示图像。它支持各种图像来源,例如本地资源、网络图像和内存图像。可以自定义其属性,如大小、缩放和对齐方式,以及处理加载和错误状态。

Image(
  image: AssetImage('assets/images/flutter_logo.png'),
  width: 100.0,
  height: 100.0,
)

StatelessWidget和StatefulWidget

StatelessWidget:
StatelessWidget是一种无状态的小部件,意味着它在创建后是不可变的,不会随时间改变。它基于构建函数的输入参数,一旦构建完成,就渲染出静态的用户界面。简单来说,StatelessWidget没有内部状态(state)。

import 'package:flutter/material.dart';

class MyWidget extends StatelessWidget {
  final String text;

  MyWidget({required this.text});

  
  Widget build(BuildContext context) {
    return Container(
      child: Text(text),
    );
  }
}

StatefulWidget:
StatefulWidget是一种有状态的小部件,它的内部状态可以随时间变化,所以它可以在创建后重新构建。StatefulWidget由两个部分组成:一个是State对象,用于保存和管理小部件的状态,另一个是StatefulWidget类本身,用于构建小部件的UI。

import 'package:flutter/material.dart';

class CounterWidget extends StatefulWidget {
  
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('Counter: $_counter'),
        ElevatedButton(
          onPressed: _incrementCounter,
          child: Text('Increment'),
        ),
      ],
    );
  }
}

GestureDetector

用于处理用户手势和触摸事件。它可以用于识别和响应各种手势,如点击、长按、拖动、缩放和滑动等。GestureDetector 可以包裹任何其他小部件,并通过回调函数来响应不同的手势事件。

GestureDetector 的常用属性和介绍:

  • onTap: 当用户轻触手势时触发的回调函数。
  • onDoubleTap: 当用户双击手势时触发的回调函数。
  • onLongPress: 当用户长按手势时触发的回调函数。
  • onLongPressMoveUpdate: 当用户在长按手势的情况下移动时触发的回调函数。
  • onVerticalDragDown: 当用户在垂直方向开始拖动手势时触发的回调函数。
  • onVerticalDragEnd: 当用户在垂直方向结束拖动手势时触发的回调函数。
  • onScaleStart: 当用户开始缩放手势时触发的回调函数。
  • onScaleUpdate: 当用户进行缩放手势时触发的回调函数。
  • behavior: 用于指定如何识别和处理手势事件的 HitTestBehavior。

使用示例:

import 'package:flutter/material.dart';

class MyGestureDetector extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GestureDetector(
      // 点击事件
      onTap: () {
        print('onTap');
      },
      // 双击事件
      onDoubleTap: () {
        print('onDoubleTap');
      },
      // 长按事件
      onLongPress: () {
        print('onLongPress');
      },
      // 缩放手势
      onScaleStart: (details) {
        print('onScaleStart: ${details.focalPoint}');
      },
      onScaleUpdate: (details) {
        print('onScaleUpdate: ${details.focalPoint}, ${details.scale}');
      },
      onScaleEnd: (details) {
        print('onScaleEnd: ${details.velocity}');
      },
      // 拖动手势
      onPanStart: (details) {
        print('onPanStart: ${details.globalPosition}');
      },
      onPanUpdate: (details) {
        print('onPanUpdate: ${details.globalPosition}');
      },
      onPanEnd: (details) {
        print('onPanEnd: ${details.velocity}');
      },
      // 指针击中测试
      behavior: HitTestBehavior.opaque,
      // 点击区域的命中测试
      hitTestBehavior: HitTestBehavior.translucent,
      // 排除特定手势
      excludeFromSemantics: true,
      // 双击事件的时间窗口
      doubleTapTimeout: Duration(milliseconds: 300),
      // 长按事件的时间窗口
      longPressTimeout: Duration(milliseconds: 500),
      // 长按事件的触发间隔
      longPressMoveUpdateDelay: Duration(milliseconds: 200),
      // 其它属性
      dragStartBehavior: DragStartBehavior.start,
      child: Container(
        width: 200,
        height: 200,
        color: Colors.blue,
      ),
    );
  }
}

Stack

Stack 是一个用于将多个小部件(Widgets)叠加在一起的布局小部件。Stack 允许您将小部件堆叠在其他小部件之上,这样可以创建各种复杂的布局,例如叠加式用户界面元素,重叠的图像和文本等。

Stack 的主要特点和用法包括:

  1. 子部件的堆叠:Stack 可以包含多个子部件,它们会按照添加的顺序堆叠在一起。最后添加的子部件位于最上面。

  2. 定位子部件:通过 Positioned 小部件,您可以精确控制子部件在 Stack 中的位置。通过设置 left、top、right 和 bottom 属性,您可以指定子部件的左上角和右下角在 Stack 中的位置。

  3. 溢出处理:当子部件的大小超出 Stack 的边界时,您可以使用 overflow 属性来指定如何处理溢出内容。常见的选项包括 Overflow.clip(剪切超出边界的部分)和 Overflow.visible(允许子部件超出边界)。

  4. Alignment:您可以使用 alignment 属性来控制 Stack 中所有子部件的对齐方式。这会影响所有子部件的位置,除非子部件自身使用 Positioned 进行了具体定位。

示例:

Stack(
  alignment: Alignment.center, // 子部件的默认对齐方式
  children: <Widget>[
    Container(
      width: 200,
      height: 200,
      color: Colors.blue,
    ),
    Positioned(
      left: 50,
      top: 50,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.red,
      ),
    ),
    Positioned(
      right: 50,
      bottom: 50,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.green,
      ),
    ),
  ],
)

Align

Align 是一个用于将单个子部件(Widget)相对于父部件进行对齐的小部件。Align 允许您精确控制子部件在父部件内的位置,并指定子部件在水平和垂直方向上的对齐方式。

Align 小部件的主要属性包括:

  1. alignment:alignment 属性是 Alignment 类型的,用于指定子部件在父部件中的对齐方式。Alignment 使用 Alignment.x 和 Alignment.y 的值来表示水平和垂直方向上的对齐,它的取值范围是从 -1.0 到 1.0,其中 -1.0 表示左侧或顶部,1.0 表示右侧或底部,0.0 表示居中。

  2. child:child 属性用于指定要对齐的子部件。这是一个单一的小部件,通常是一个容器或其他UI元素。

示例:

Align(
  alignment: Alignment.center, // 将子部件居中对齐
  child: Container(
    width: 100,
    height: 100,
    color: Colors.blue,
    child: Text('Centered', style: TextStyle(color: Colors.white)),
  ),
)

InkWell

InkWell 的主要功能是在用户触摸屏幕时为其子项提供"涟漪"动画效果。这种涟漪效果是材料设计中的一个典型的触摸反馈,它可以给用户一个明确的视觉反馈,表示某个元素已经被触摸。

除了涟漪动画效果,InkWell 还提供了一系列的回调函数,例如:

  • onTap: 用户轻触屏幕时触发。
  • onDoubleTap: 用户双击屏幕时触发。
  • onLongPress: 用户长按屏幕时触发。

示例

InkWell(
  onTap: () {
    print('InkWell tapped');
  },
  child: Container(
    width: 100,
    height: 100,
    color: Colors.blue,
    child: Center(
      child: Text('Tap Me'),
    ),
  ),
)


三.对齐 widgets

mainAxisAlignment和crossAxisAlignment是用于定位和对齐子部件的属性,它们通常用于Flex、Row和Column等布局小部件中。
在这里插入图片描述
mainAxisAlignment的值可以是以下之一:

  • MainAxisAlignment.start:将子部件沿主轴的起始位置对齐。
  • MainAxisAlignment.end:将子部件沿主轴的结束位置对齐。
  • MainAxisAlignment.center:将子部件沿主轴的中心位置对齐。
  • MainAxisAlignment.spaceBetween:将子部件均匀地分布在主轴上,使它们之间的间距相等,第一个子部件放置在起始位置,最后一个子部件放置在结束位置。
  • MainAxisAlignment.spaceAround:将子部件均匀地分布在主轴上,使它们之间和两端的间距相等。
  • MainAxisAlignment.spaceEvenly:将子部件均匀地分布在主轴上,使它们之间的间距和两端的间距相等。

mainAxisAlignment使用示例:

Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetween,
  children: [
    Container(color: Colors.red, width: 50, height: 50),
    Container(color: Colors.green, width: 50, height: 50),
    Container(color: Colors.blue, width: 50, height: 50),
  ],
)

crossAxisAlignment的值可以是以下之一:

  • CrossAxisAlignment.start:将子部件沿副轴的起始位置对齐。
  • CrossAxisAlignment.end:将子部件沿副轴的结束位置对齐。
  • CrossAxisAlignment.center:将子部件沿副轴的中心位置对齐。
  • CrossAxisAlignment.stretch:将子部件沿副轴拉伸以填充可用空间。
  • CrossAxisAlignment.baseline:将子部件的基线与副轴上的基准线对齐,需要在子部件上设置基线对齐方式(如TextBaseline)。

crossAxisAlignment使用示例:

Column(
  crossAxisAlignment: CrossAxisAlignment.center,
  children: [
    Container(color: Colors.red, width: 50, height: 50),
    Container(color: Colors.green, width: 50, height: 50),
    Container(color: Colors.blue, width: 50, height: 50),
  ],
)


四.调整widgets大小

Expanded widget
用于在父部件的剩余可用空间中扩展一个子部件。它通常与Flex、Column或Row等灵活的布局小部件一起使用,以便在父部件中使用弹性盒子模型进行布局。

当Expanded小部件包装在一个子部件周围时,它会将该子部件填充并扩展到可用空间的剩余部分,以沿着主轴方向占据所有剩余的空间。这使得子部件能够灵活地从父部件中分配和占据可用空间,而不受其自身固定大小的限制。

使用示例

Row(
  children: [
    Container(color: Colors.red, width: 50, height: 50),
    Expanded(
      child: Container(color: Colors.green),
    ),
    Container(color: Colors.blue, width: 50, height: 50),
  ],
)

Flex
Flex用于创建灵活的布局,可以根据可用空间的大小动态调整子部件的大小。可以将 Flex 小部件作为Expanded的子部件,并通过指定flex属性来控制子部件在可用空间中的分配比例。
可以简单理解为LinearLayout中的权重

使用示例

Row(
  children: [
    Container(color: Colors.red, width: 50, height: 50),
    Expanded(
      flex: 2,
      child: Container(color: Colors.green),
    ),
    Expanded(
      flex: 1,
      child: Container(color: Colors.blue),
    ),
  ],
)

当一个Expanded组件包含在一个垂直方向(或水平方向)的Flex容器(如Column或Row)中时,该Expanded组件会将其子组件填充到相应方向上的所有可用空间。如果有多个垂直方向的Expanded组件,则它们会按照它们的flex属性(默认为1)来分配可用空间。

换句话说,Expanded组件在默认情况下会尽可能地扩展,以填充Flex容器中剩余的可用空间,但具体的高度取决于Flex容器的大小和其他子组件的约束条件

五.通用布局 widgets

标准 widgets

  • Container:向 widget 增加 padding、margins、borders、background color 或者其他的“装饰”。

  • GridView:将 widget 展示为一个可滚动的网格。

  • ListView:将 widget 展示为一个可滚动的列表。

  • Stack:将 widget 覆盖在另一个的上面。

Material widgets

  • Card:将相关信息整理到一个有圆角和阴影的盒子中。

  • ListTile:将最多三行的文本、可选的导语以及后面的图标组织在一行中。


六.输入表单

TextField (文本框)

用于接收用户输入文本的小部件,它提供了一个可编辑的文本框,用户可以在其中输入、编辑和选择文本。

常用的属性及其作用:

  1. controller: 一个 TextEditingController 对象,用于控制文本输入框的值,获取输入的内容或设置初始值。
  2. focusNode: 一个 FocusNode 对象,用于管理输入框的焦点。
  3. decoration: InputDecoration 类型的对象,用于定义输入框的外观,包括标签文本、提示文本、边框样式等。
  4. keyboardType: TextInputType 枚举类型,指定键盘的类型,以匹配输入的预期内容,如文本、数字、URL、电子邮件等。
  5. textInputAction: TextInputAction 枚举类型,定义了与输入框关联的操作按钮的行为,如完成、下一步、搜索等。
  6. onChanged: 输入内容变化时的回调函数,接受最新的输入值作为参数,通常用于实时校验或更新状态。
  7. onSubmitted: 用户提交输入后的回调函数,接受最终的输入值作为参数。
  8. obscureText: bool 值,用于指定是否要隐藏输入内容,常用于密码输入框。
  9. maxLines: int 值,用于指定输入框的最大行数。
  10. maxLength: int 值,用于指定最大输入长度。
  11. enabled: bool 值,用于指定输入框是否可编辑。
  12. autofocus: bool 值,用于指定是否自动获取焦点。
  13. textAlign: TextAlign 枚举类型,指定文本内容的对齐方式,如左对齐、右对齐、居中等。
  14. cursorColor: Color 对象,指定光标的颜色。
  15. cursorWidth: double 值,用于指定光标的宽度。

使用示例:

import 'package:flutter/material.dart';

class MyTextField extends StatefulWidget {
  
  _MyTextFieldState createState() => _MyTextFieldState();
}

class _MyTextFieldState extends State<MyTextField> {
  TextEditingController _controller = TextEditingController();
  FocusNode _focusNode = FocusNode();

  
  void dispose() {
    _controller.dispose();
    _focusNode.dispose();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return TextField(
      controller: _controller,
      focusNode: _focusNode,
      decoration: InputDecoration(
        labelText: 'Enter your name',
        hintText: 'John Doe',
        prefixIcon: Icon(Icons.person),
        suffixIcon: IconButton(
          icon: Icon(Icons.clear),
          onPressed: () {
            _controller.clear();
          },
        ),
        border: OutlineInputBorder(),
      ),
      keyboardType: TextInputType.text,
      textInputAction: TextInputAction.done,
      onChanged: (value) {
        print('Input: $value');
      },
      onSubmitted: (value) {
        print('Submitted: $value');
        _focusNode.unfocus();
      },
    );
  }
}

关于TextEditingController和FocusNode的介绍:

TextEditingController
TextEditingController是一个控制文本输入的类,它提供了一些方法和属性来获取和修改TextField中输入的文本。主要作用包括:

  • 可以获取TextField中的文本内容:使用text属性可以获取TextField中当前的文本内容。
  • 可以设置TextField的初始值或修改文本内容:使用text属性可以设置TextField的初始值,也可以通过textEditingController.text = newText来修改文本内容。
  • 可以监听文本变化:可以通过注册addListener()方法来监听TextField中的文本变化,以便执行特定的操作。

FocusNode
FocusNode是用于处理TextField焦点的类,它允许管理应用程序中的焦点,并监听焦点变化事件。主要作用包括:

  • 管理TextField的焦点:通过将TextField的focusNode属性设置为FocusNode对象,可以管理TextField的焦点。例如,可以使用focusNode.requestFocus()请求焦点,并使用focusNode.unfocus()取消焦点。
  • 监听焦点变化:可以通过注册addListener()方法来监听焦点的变化,以便在焦点状态发生变化时执行特定的操作,比如显示或隐藏键盘。
  • 控制键盘行为:通过设置keyboardType和textInputAction属性,可以控制键盘的类型(例如纯文本、数字等)和键盘完成按钮的样式(例如完成、下一个等)。

TextFormField (表单文本框)

TextFormField 是一个带有表单功能的文本输入字段小部件。它是基于 TextField 的封装,并提供了一些额外的功能,如表单验证和错误处理。

常用属性及其作用:

  1. controller: 一个 TextEditingController 对象,用于控制文本输入框的值,获取输入的内容或设置初始值。

  2. focusNode: 一个 FocusNode 对象,用于管理输入框的焦点。

  3. decoration: InputDecoration 类型的对象,用于定义输入框的外观,包括标签文本、提示文本、边框样式等。

  4. keyboardType: TextInputType 枚举类型,指定键盘的类型,以匹配输入的预期内容,如文本、数字、URL、电子邮件等。

  5. textInputAction: TextInputAction 枚举类型,定义了与输入框关联的操作按钮的行为,如完成、下一步、搜索等。

  6. validator: 一个函数,接受输入的字符串,根据需求返回一个错误提示字符串,用于对输入内容进行验证。

  7. onChanged: 输入内容变化时的回调函数,接受最新的输入值作为参数,通常用于实时校验或更新状态。

  8. onFieldSubmitted: 用户提交输入后的回调函数,接受最终的输入值作为参数。

使用示例:

import 'package:flutter/material.dart';

class MyForm extends StatefulWidget {
  
  _MyFormState createState() => _MyFormState();
}

class _MyFormState extends State<MyForm> {
  final _formKey = GlobalKey<FormState>();
  TextEditingController _nameController = TextEditingController();
  
  
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: TextFormField(
        controller: _nameController,
        decoration: InputDecoration(
          labelText: 'Name',
          hintText: 'Enter your name',
        ),
        validator: (value) {
          if (value.isEmpty) {
            return 'Please enter your name';
          }
          return null;
        },
        onFieldSubmitted: (value) {
          if (_formKey.currentState.validate()) {
            // 执行提交操作
          }
        },
      ),
    );
  }
}


七.关键词

part

用于将多个Dart文件组织在一起,以便更好地管理和维护代码。

part 指令是Dart语言的一部分,它允许你将一个Dart文件分成多个部分,并将它们组合在一起以形成一个完整的库。这对于将大型代码库分解为更小的可管理部分非常有用。

part ‘WeiBoCommentList.g.dart’; 表示当前的Dart文件是一个库的一部分,并且需要引入另一个名为 WeiBoCommentList.g.dart 的Dart文件,以共享一些代码或声明。

通常,part 指令在使用代码生成工具时非常有用,例如json_serializable或moor_generator。这些工具可以根据模型类自动生成代码,而将生成的代码放在单独的文件中,然后使用 part 指令将其引入到主要的模型文件中。

例如,假设 WeiBoCommentList.g.dart 包含自动生成的序列化或数据库访问代码,而 WeiBoCommentList.dart 包含模型类的定义。通过使用 part 指令,你可以将自动生成的代码与手动编写的代码分离开来,以便更轻松地维护和管理项目。

Completer

Completer 是一个用于处理异步操作的类,它允许你手动控制异步操作的完成和结果返回。Completer 的主要作用是创建一个 Future 对象,并允许你在某个后续时刻手动完成这个 Future,从而传递一个值或错误。

以下是 Completer 的主要作用:

  1. 手动完成 Future:使用 Completer,你可以创建一个未来的实例,并在需要的时候手动完成它。这对于异步操作,如网络请求、文件读写等,非常有用,因为你可以在操作完成后通过 Completer 将结果传递给等待的代码。

  2. 处理异步操作的结果:当你使用异步操作时,通常需要等待操作完成并获取结果。通过 Completer 创建的 Future,你可以使用 await 关键字或 .then() 方法等方式来等待操作完成,并获取其结果。

示例:

import 'dart:async';

Future<void> fetchData() async {
  Completer<void> completer = Completer<void>();

  // 模拟一个异步操作,等待2秒钟后完成
  Future.delayed(Duration(seconds: 2), () {
    completer.complete(); // 手动完成Future
  });

  await completer.future; // 等待Future完成

  print('Data fetched successfully');
}

void main() {
  fetchData();
  print('Fetching data...'); // 这一行会在异步操作完成前执行
}

StreamSubscription

StreamSubscription 是使用 Dart 中的流(Stream)的一种方式。流是一系列异步事件的序列,可以用于接收和处理来自异步操作(如网络请求、数据库查询等)的事件。

StreamSubscription 用于订阅流,并可以跟踪和取消订阅。当你订阅一个流时,你可以指定一个回调函数来处理流中发出的事件。回调函数会在每个事件到达时被调用,而不是等待整个流完成。

订阅流

要订阅流,首先需要获取一个流对象。在Flutter中,很多类(如StreamController、StreamTransformer等)都提供了流的实例化和管理。一旦获取到流对象,你可以使用stream.listen()方法订阅流,并提供一个回调函数来处理流中的事件。

Stream<int> countStream() async* {
  for (int i = 1; i <= 5; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() {
  final stream = countStream();
  final subscription = stream.listen((data) {
    print('Received: $data');
  });

  // 取消订阅
  subscription.cancel();
}

上面的示例中,创建了一个简单的计数流countStream(),它每隔一秒产生一个整数。我们通过stream.listen()方法订阅了这个流,并提供了一个回调函数来处理每个事件。

取消订阅

当不再需要订阅流时,应该显式地取消订阅,以释放资源和停止事件的处理。可以调用StreamSubscription对象的cancel()方法来取消订阅。

final subscription = stream.listen((data) {
  print('Received: $data');
});

// 取消订阅
subscription.cancel();

在上面的示例中,保存了StreamSubscription对象到subscription变量中,并在不再需要时调用了cancel()方法来取消订阅。

使用StreamSubscription的其他方法和属性

StreamSubscription提供了一些其他有用的方法和属性,用于管理订阅和检查流的状态,例如:

  • pause()和resume():暂停和恢复订阅,以便控制事件的处理。
  • onData():设置一个新的事件回调函数,替换原来的回调函数。
  • onError():设置一个错误回调函数,用于处理流中的错误事件。
  • onDone():设置一个完成回调函数,用于处理流结束时的事件。
  • isPaused:一个布尔值,表示当前订阅是否已暂停。

mixin

Mixin是一种强大的代码重用机制,它允许你将一个类的成员添加到另一个类中,而无需继承该类。Mixin提供了一种方式来在类之间共享代码,同时保持类之间的分离性。

1. 基本语法
class MyClass with MyMixin {
  // 类的成员和方法
}

mixin MyMixin {
  // Mixin中的成员和方法
}

在上面的代码中,MyClass类通过with MyMixin语法引入了MyMixin的功能。

2. Mixin的特点
  • Mixin类本身不能被实例化,它们只能被用作其他类的组成部分。
  • 类可以使用多个Mixin,通过逗号分隔,这允许多个类的功能被组合到一个类中。
  • Mixin可以有自己的属性和方法,这些属性和方法可以被包含Mixin的类访问和使用。
  • 如果多个Mixin中有同名的方法或属性,那么包含Mixin的类必须通过显式指定使用哪个Mixin的方式来解决冲突。
  • Mixin的顺序很重要,因为方法冲突时会按照Mixin的顺序来解析。
3. Mixin的应用场景
3.1. 接口实现

Mixin可以用于实现接口,允许一个类同时具有多个接口的功能。

class MyWidget with WidgetMixin, ClickableMixin {
  // ...
}
3.2. 功能复用

Mixin可以用于将通用功能添加到多个类中,避免重复编写相似的代码。

mixin LoggerMixin {
  void log(String message) {
    print(message);
  }
}

class MyClass with LoggerMixin {
  // ...
}
3.3. 数据序列化与反序列化

Mixin可以用于为多个数据模型类添加数据序列化和反序列化的功能。

mixin JsonSerializable {
  Map<String, dynamic> toJson();
  void fromJson(Map<String, dynamic> json);
}

class Person with JsonSerializable {
  // ...
}
3.4. 路由导航

在Flutter中,Mixin经常用于处理路由导航,以减少页面之间的代码冗余。

3.5. 状态管理

在Flutter中,StatefulWidget常常使用Mixin来添加状态管理的功能。

with

with关键字用于在类定义中混入(mixin)一个或多个 mixin 类。Mixin 是一种在 Dart 中实现代码重用的机制,它允许你将一个或多个 mixin 类的特性添加到一个类中,而无需继承这些 mixin 类。

使用方式:

class MyClass with Mixin1, Mixin2, ... {
  // 类的成员和方法
}

关于 with 关键字的详细介绍:

  1. 混入Mixin的类:with 后面可以跟一个或多个 mixin 类,用逗号分隔。这意味着你可以从多个 mixin 类中继承特性,将它们组合到一个类中,从而实现多重继承的效果。

  2. Mixin的顺序:Mixin 的顺序很重要,因为如果多个 mixin 类中具有相同名称的属性或方法,类中将使用最后一个 mixin 中定义的属性或方法。这个规则确保了 mixin 类的顺序对类的行为产生影响。

  3. Mixin的特性:通过使用 with 关键字,类将继承 mixin 类的属性、方法和功能,这些特性会被添加到类中。这允许你在不继承 mixin 类的情况下,使用 mixin 类的功能。

  4. Mixin的用途:with 关键字通常用于以下情况:

  • 实现接口:通过混入一个 mixin 类,类可以实现多个接口的功能。
  • 代码复用:可以将通用功能添加到多个类中,以减少代码重复性。
  • 实现混合功能:在不使用多重继承的情况下,将多个 mixin 类的功能组合在一个类中。

dynamic和Object

1、Object 是dart所有对象的根基类,也就是说所有类型都是Object的子类,所以任何类型的数据都可以赋值给Object声明的对象.
2、dynamic与var一样都是关键词,声明的变量可以赋值任意对象. 而dynamic与Object相同之处在于,他们声明的变量可以在后期改变赋值类型.

typedef

用于创建自定义类型别名(type alias)。类型别名允许你为现有的数据类型或函数签名定义一个新的名称,以便在代码中更清晰地表达类型或函数签名的含义

以下是关于typedef关键字的详细介绍:

  1. 为数据类型创建类型别名:
typedef IntList = List<int>;
typedef StringMap = Map<String, String>;

  1. 为函数签名创建类型别名:
    对于回调函数或函数参数特别有用
typedef VoidCallback = void Function();
typedef BinaryOperation = int Function(int, int);

  1. 与高阶函数一起使用:
typedef FilterFunction<T> = bool Function(T);

List<T> filterList<T>(List<T> list, FilterFunction<T> filter) {
  return list.where(filter).toList();
}

get

get关键字用于创建一个Getter方法,它允许你访问对象的属性或计算属性的值,就像访问类的实例变量一样。Getter方法通常用于获取对象的某个属性值,而不是直接访问实例变量,以提供更多的封装和控制。

1.创建Getter方法:通过在类中定义一个以get关键字开头的方法,你可以创建一个Getter方法,该方法用于获取某个属性的值。Getter方法的语法如下:

Type get propertyName {
  // 在这里计算和返回属性的值
}

其中,Type是属性的数据类型,propertyName是你希望暴露的属性名称。

2.延迟加载属性:Getter方法可以用于延迟加载属性的值。这意味着属性的值只有在首次访问Getter方法时才会计算,而不是在对象创建时。这对于节省资源和提高性能很有用。

class LazyLoader {
  List<int> _data = [1, 2, 3, 4];

  int get sum {
    // 计算并返回列表元素的总和
    return _data.reduce((a, b) => a + b);
  }
}

3.属性访问控制:使用Getter方法可以对属性的访问进行控制,例如,你可以在Getter方法中添加条件来检查属性的有效性,然后返回相应的值。

class Temperature {
  double _celsius;

  Temperature(this._celsius);

  double get celsius {
    if (_celsius < -273.15) {
      throw ArgumentError("Temperature cannot be below absolute zero.");
    }
    return _celsius;
  }
}

4.在子类中覆盖:Getter方法可以在子类中被覆盖,允许你根据需要自定义子类的属性访问行为。

class Parent {
  int get value => 42;
}

class Child extends Parent {
  
  int get value => super.value * 2; // 在子类中覆盖Getter方法
}

async await Future

async 用于表示某个函数是一个异步函数,它可以执行异步操作而不会阻塞应用程序的主线程。异步操作通常包括网络请求、文件读写、定时器等需要等待一段时间才能完成的任务。

async的详细介绍:

  1. 异步函数声明: 要声明一个异步函数,只需在函数声明前加上async关键字。例如:
Future<void> fetchData() async {
  // 异步操作的代码
}

这个函数是一个异步函数,它返回一个Future,表示它将在未来某个时间点完成。

  1. await关键字: 在异步函数中,可以使用await关键字来等待其他异步操作完成,而不会阻塞当前函数的执行。例如:
Future<void> fetchData() async {
  var result = await fetchSomeDataFromNetwork();
  // 在fetchSomeDataFromNetwork完成后,继续执行后续代码
}

在这个示例中,await会等待fetchSomeDataFromNetwork函数完成,并且只有在该函数完成后才会继续执行后续代码。

  1. Future对象: 异步函数通常返回一个Future对象,表示异步操作的结果或状态。Future对象可以有不同的泛型类型,例如Future<int>表示一个将来会返回整数结果的Future。您可以使用Future对象来处理异步操作的成功和失败,以及获取异步操作的结果。
Future<void> fetchData() async {
  try {
    var result = await fetchSomeDataFromNetwork();
    // 处理成功的结果
  } catch (error) {
    // 处理发生错误的情况
  }
}
  1. 错误处理: 在异步操作中,错误处理至关重要。可以使用try-catch块来捕获可能出现的异常,并处理它们。上面的示例中就包括了一个try-catch块,以处理可能在fetchSomeDataFromNetwork中抛出的错误

  2. 并发异步操作: 在Flutter中,可以同时运行多个异步操作,并等待它们全部完成,可以通过Future.wait函数来实现。这对于同时发起多个网络请求或执行多个并行任务非常有用。

Future<void> fetchMultipleData() async {
  var result1 = fetchSomeDataFromNetwork1();
  var result2 = fetchSomeDataFromNetwork2();
  
  // 等待多个异步操作完成
  await Future.wait([result1, result2]);
  
  // 继续执行后续代码
}

未完待续…

Flutter学习笔记 Form表单 Form表单需要设置一个全局类型的GlobalKey,通过这个key获取表单对象 GlobalKey<FormState> _formKey = new GlobalKey<FormState>(); //获取表单当前实例对象 _formKey.currentState; //重置表单内容 _formKey.currentState.reset(); //验证... 阅读详情

相关推荐

【Flutter】 Flutter 实现 List Sort 排序 解决复杂业务逻辑下的数据排序问题

在 Flutter 中,List 是一种常用的数据结构,它可以存储一系列的数据。List 的排序是一个常见的需求,

Code Metaverse 2254

Flutter中Map、List数组的常用方法

list.add('我是文本');// [我是文本, 0.66]}

haoxuhong的博客 9106

【Flutter 问题系列第 74 篇】在 Flutter 中如何对 Uint8List 和 File 类型的图像数据进行压缩

在 Flutter 中如何对 Uint8List 和 File 类型的图像数据进行压缩。

“Allen Su”的博客 5232

dart语法中list相关详解

循环遍历 List 中的数据 List 数据转 Map 数据 连接 List 中的数据 合并 List 中的数据 随机排列 List中的数据顺序 升序排列 List 中的数据 去重复 查找 List 中的元素 获取 List 中指定位置的值 List 中数据修改 List 中数据删除

坚果的博客 1457

华为昇腾310P3+deepseek蒸馏版性能调优:FP16精度优化全记录

本文详细介绍了在华为昇腾310P3硬件环境下优化DeepSeek蒸馏版模型FP16精度的关键技术路径。通过分层量化策略、内存分配优化和并行计算配置,显著提升模型推理性能,实现83%的并发处理能力提升,同时保持98.7%的原始模型准确率。

weixin_29074409的博客 346

Proteus 8.9仿真五路抢答器:从74LS148编码到NE555报警的保姆级电路拆解

本文详细解析了使用Proteus 8.9仿真五路抢答器的完整设计流程,从74LS148优先编码器到NE555定时报警电路。通过保姆级的电路拆解和芯片选型指南,帮助读者掌握数字电路中的编码、锁存、译码和定时等核心技术,实现稳定可靠的抢答系统仿真。

weixin_30836759的博客 380

listview一个item只能显示255个字节的数据

其余的数据通过hint显示出来,不知道如何才能取消这个限制?

LinuxCard的专栏 776

浅谈车联网概述-1

车联网技术目前在车企中应用广泛,车联网通过车载传感器、无线通信等技术,能够将车辆上百的传感器数据上传至云端,当前智能网联车辆可以理解为一个“大号”手机。

Hello, World! 新能源汽车智能网联工程师,分享日常工作思考。 559

Flutter 学习笔记汇总

Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,Flutter 学习笔记汇总,F

川峰的博客 1195

FPGA中参数化SPI接口设计与Verilog实现

SPI(串行外设接口)作为嵌入式系统的核心通信协议,通过全双工、高速率特性在FPGA与Flash、ADC等外设交互中占据重要地位。参数化设计通过抽象时钟极性、数据位宽等可配置维度,采用分层架构实现硬件复用,显著提升开发效率。Verilog实现需重点处理跨时钟域同步和可配置帧结构,结合AXI总线集成与UVM验证方法学,可构建适应工业控制、物联网网关等场景的高可靠SPI解决方案。

ciya3282的博客 1408

YoloV8优化:感受野注意力卷积运算(RFAConv),效果秒杀CBAM和CA等 | 即插即用系列

感受野注意力卷积运算(RFAConv),解决卷积块注意力模块(CBAM)和协调注意力模块(CA)只关注空间特征,不能完全解决卷积核参数共享的问题

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4264

flutter一些学习笔记

Flutter语言(学习网站:Flutter教程 - Flutter中文网 (flutterchina.club)) flutter的下载安装: 注意 国内访问flutter可能会受限制,可下载国内镜像 PUB_HOSTED_URL https://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 安装 1、电脑配置JDK(下载jdk,配置jdk ) 2、下载安装Android studio 3、下载配置f

m0_52538284的博客 1766

【高级雷达感知与学习】 第十三章 可解释性与物理–感知融合(Physics-Informed ML)

本文提出了一种面向雷达感知的物理约束学习方法,将雷达物理先验(RCS、SNR、距离衰减)嵌入神经网络,解决纯数据驱动模型的样本效率低、泛化能力弱和决策不可信问题。通过三种融合范式(混合建模、物理正则化、PINNs)实现机理与数据协同建模,并设计了物理引导显著图解决雷达可解释性语义错位问题。实验表明,物理约束可提升40%样本效率,增强低信噪比场景鲁棒性。代码实现包含物理正则化损失、可解释性分析和消融实验,为雷达感知系统提供了可迁移的工程范本。

VectorShift的博客 186

flutter学习笔记(四)

一个完整的路由页包含导航栏,抽屉菜单以及底部tab导航菜单等。如果每个路由都需要开发者自己手动去实现这些,这会是一件非常麻烦的事,幸运的是,Flutter Material组件库提供了一些现成的组件减少我们的开发任务,Scaffold是一个路由页的骨架,我们可以使用它很容易的拼装出一个完整的页面。在Decoration中,通过Transform.translate来接受一个offset参数,来实现在绘制时沿x,y轴对子组件平移指定的距离,此处的坐标系是以左上角为原点,同时向左向上为负。

qq_58039700的博客 1858

【2026OD新机考】【哈希表】20260422-文章特征提取【Py/Java/C++/C/JS/Go六种语言OD真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

90+天陪伴式学习,100+直播课时,300+动画图解视频,500+LeetCode经典题,500+华为OD真题/大厂真题,还有简历修改、模拟面试、陪伴小群、资深HR对接将为你解锁。这道题的本质是多集合交集问题的变形,属于非常典型的哈希表应用题。,储存全局的每个片段中,各个字符最少出现的次数。表示该字母并非所有片段的公共字母。,按照顺序构建答案即可。没有字母在所有三个字符串中都出现。每个字母在各字符串中都至少出现。次,所以结果中每个字母出现一次。这样,当上述循环结束后,最终。显然在上述代码中,如果字母。

weixin_48157259的博客 66

Arduino I2C for TCA9548A应答扫描程序

Arduino I2C for TCA9548A应答扫描程序

perseverance51博客 1119

Flutter 学习笔记

关于我的学习概述

guo5236的博客 232

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

flutter学习笔记(一)

获取 StatefulWidget 的状态的方法是通用的,我们并不能在语法层面指定 StatefulWidget 的状态是否私有,所以在 Flutter 开发中便有了一个默认的约定:如果 StatefulWidget 的状态是希望暴露出的,应当在 StatefulWidget 中提供一个。在flutter中main方法为应用程序的入口,runApp()接受一个Widget类型的参数,在示例代码中,这个参数为一个MyApp()的对象,main方法调用runApp()启动了My App()这个对象。

qq_58039700的博客 1681

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

flutter学习笔记(二)

maxLines/overflow:指定文本显示的最大行数,默认情况下,文本会自动换行,指定上述参数的话,文本不会超过指定的值,有多余文本的情况下,可以使用overflow指定阶段方式,示例中的方式是之后的内容使用...省略。textAlign:文本的对其方式,可选左对齐,右对齐,居中。:图片的宽度会缩放到显示空间的宽度,高度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。:图片的高度会缩放到显示空间的高度,宽度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。

qq_58039700的博客 1211

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

dart及flutter学习笔记

dart及flutter的学习笔记

Meartion的博客 778

2021年还没上手 Flutter 的移动开发们该看看这份Git高星的286页学习笔记了!

现在的开发大环境就是“小步快跑、快速迭代”,“一套代码、多端运行”这一直是很多开发团队的梦想,美团也一样。他们做了很多跨平台开发框架的尝试:React Native、Weex、PWA 等等。但都没有得到很好的解决,直至遇到 Flutter。 Flutter 的优点 Flutter 提供了一整套从底层渲染逻辑到上层开发语言的完整方案 跨平台 高保真 高性能 …… 从刚发布开始,Flutter 的热度一路攀升,受到众多开发者的青睐。发展到现在已经有了 阿里闲鱼、今日头条、腾讯 Now 直播 等在内的一.

BUGgogogo的博客 1637

flutter截取字符串_Flutter学习笔记

全部章节的笔记:1.使用var声明变量,可赋予不同类型的值。如果不初始化变量的值,则默认是null。赋值以后变量的数据类型就已经确定。2.使用final声明一个只能赋值一次的变量。3.使用const声明常量。使用const声明的必须是编译期常量(在编译的时候就能确定的值)。4.isNaN是否是非数字,isEven是否是偶数,isOdd是否是奇数。abs()绝对值,round()四舍五入,floor...

weixin_35241867的博客 3623

Flutter学习笔记(五)组件之Material组件介绍

Flutter学习笔记(五)组件之Material组件介绍

倚栏静望的博客 945

Flutter这么好用,你确定不进来瞧瞧吗?(附免费《Flutter进阶学习笔记》

Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。Flutter 开源、免费,拥有宽松的开源协议,适合商业项目。Flutter可以方便的加入现有的工程中。在全世界,Flutter 正在被越来越多的开发者和组织使用,并且 Flutter是完全免费、开源的。它也是构建未来的 Google Fuchsia 应用的主要方式。

2401_84166327的博客 789

《Flutter实战 第二版》学习笔记-01

google推出并开源的跨平台应用开发框架(也有说是UI框架),使用dart语言开发,代码可以运行在iOS、Andriod、桌面、web端(这里可以参考java的一处编译到处乱跑),有自己的跨平台自绘引擎(还是UI框架),不使用iOS或者Andriod的操作系统原生控件(所以需要和操作系统之间进行通讯,开发完成交给操作系统绘制UI树,可以引出flutter的架构),具体就是通过skia来绘制widget是一个接口,在接口中描述UI元素的配置信息,就是widget接收的参数,

不知道说点啥 944
上一篇: Component ‘MSCOMM32.0CX‘ or one of its dependencies not correctly registered: a file is missing or i
下一篇: Flutter Android & IOS 获取通讯录联系人列表
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值