第九十八期:Flutter学习(一)

2022-07-15 11:29:52 浏览数 (1)

昨天和今天除了写一些小程序的代码之外,都在学习flutter相关的内容。感觉flutter的学习成本之所以高,很大的原因其实是因为它的学习资料真正能学到东西的,其实还是它的官网,但是官网又是英文版的,读起来就比较费劲。

再一个是因为flutter的生态其实也是比较庞大的。除了基础的widget组件,还有两种不同风格的组件形式material和cupertino。除此之外,还有其他各种库,比如请求库,dio以及各种插件。

https://api.flutter.dev/flutter/material/material-library.html

官网的这个界面里枚举了flutter用到的库:

  • 组件库
  • 核心库 core
  • web端的库
  • 跨平台的继承库
  • 加密
  • 文件操作
  • ...等等

组件其实还好,因为前端的组件这个概念其实都是通用的。基于原生的最基本的标签组件,我们进行组合来实现我们的业务组件。但是和web端不同的是,flutter的组件都是对象。它的属性方法和web比起来差异很大,对于新手来说不容易记的清楚。

还有一个原因是flutter采用的Dart语言。一种类似ts但是有不同于ts的语言,这可能也是flutter学习成本相对来说比较高的一个原因吧。

今天主要熟悉了material库中常用的组件。用easymock和dio库写了个简单的get请求的示例。

把常用组件的概念以及示例代码做了一个总结,其他的也没什么东西。

material.dart 常用组件

这部分内容比较枯燥,可以简单了解一下。

基础组件

  • AppBar
  • Column
  • Container
  • ElevatedButton
  • Image
  • Placeholder
  • Row
  • Scaffold
  • Text

AppBar

属性

含义

示例

actions

title

标题

color

颜色

Colors.amber[600]

bottom

bottomOpacity

foregroundDecoration

centerTitle

elevation

flexibleSpace

示例:

代码语言:javascript复制
Scaffold(
  body: CustomScrollView(
    primary: true,
    slivers: <Widget>[
      SliverAppBar(
        title: const Text('Hello World'),
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.shopping_cart),
            tooltip: 'Open shopping cart',
            onPressed: () {
              // handle the press
            },
          ),
        ],
      ),
      // ...rest of body...
    ],
  ),
)

Column

Column 用来在垂直方向进行布局。

想要子组件自动填充垂直方向的空间,可以用Expanded组件进行包裹。

Column组件不支持滚动,如果我们需要支持滚动,则可以考虑ListView组件。

  • 属性

属性

含义

示例

children

crossAxisAlignment

横轴对齐

direction

用作主轴的方向

textDirection

textBaseline

verticalDirection

示例:

代码语言:javascript复制
Column(
  children: const <Widget>[
    Text('Deliver features faster'),
    Text('Craft beautiful UIs'),
    Expanded(
      child: FittedBox(
        fit: BoxFit.contain, // otherwise the logo will be tiny
        child: FlutterLogo(),
      ),
    ),
  ],
)

Contanier 组件

  • 属性

属性

含义

示例

alignment

对齐方式

child

子组件

color

颜色

Colors.amber[600]

constraints

应用于子级的其他约束

decoration

应用于子组件背后

foregroundDecoration

应用于子组件前

margin

const EdgeInsets.all(10.0),

padding

transform

transformAligment

width

50

height

50

  • 方法

方法

build

示例-simple:

代码语言:javascript复制
Center(
  child: Container(
    margin: const EdgeInsets.all(10.0),
    color: Colors.amber[600],
    width: 48.0,
    height: 48.0,
  ),
)

示例-complex:

代码语言:javascript复制
Container(
  constraints: BoxConstraints.expand(
    height: Theme.of(context).textTheme.headline4!.fontSize! * 1.1   200.0,
  ),
  padding: const EdgeInsets.all(8.0),
  color: Colors.blue[600],
  alignment: Alignment.center,
  transform: Matrix4.rotationZ(0.1),
  child: Text('Hello World',
    style: Theme.of(context)
        .textTheme
        .headline4!
        .copyWith(color: Colors.white)),
)

ElevatedButton 组件

  • 属性

属性

含义

示例

autofocus

child

子组件

color

颜色

Colors.amber[600]

style

onPressed

onLongPress

onHover

onFocusChange

enabled

示例:

代码语言:javascript复制
 final ButtonStyle style =
        ElevatedButton.styleFrom(textStyle: const TextStyle(fontSize: 20));

Column(
    mainAxisSize: MainAxisSize.min,
    children: <Widget>[
        ElevatedButton(
            style: style,
            onPressed: null,
            child: const Text('Disabled'),
        ),
        const SizedBox(height: 30),
        ElevatedButton(
            style: style,
            onPressed: () {},
            child: const Text('Enabled'),
        ),
    ],
    ),
);

Text 组件

文本小部件显示具有单一样式的文本字符串。根据布局约束的不同,字符串可能会跨多行中断,也可能全部显示在同一行上。

style参数是可选的。省略时,文本将使用最接近的封闭式DefaultTextStyle中的样式。如果给定样式为TextStyle。inherit属性为true(默认值),给定样式将与最近的封闭DefaultTextStyle合并。这种合并行为非常有用,例如,在使用默认字体系列和大小时,可以将文本加粗。

  • 属性

属性

含义

示例

maxLines

overflow

子组件

color

颜色

Colors.amber[600]

style

textAlign

textDirection

textHeightBehavior

textScaleFactor

textWidthBasis

布局组件

Align

子组件在父组件中进行定位。

  • 属性

属性

含义

示例

alignment

heightFactor

widthFactor

示例:

代码语言:javascript复制
Center(
  child: Container(
    height: 120.0,
    width: 120.0,
    color: Colors.blue[50],
    child: const Align(
      alignment: Alignment.topRight,
      child: FlutterLogo(
        size: 60,
      ),
    ),
  ),
)

AspectRatio

将子对象的大小调整为特定的纵横比/宽高比。

  • 属性

属性

含义

示例

aspectRatio

child

示例:

代码语言:javascript复制
Container(
      color: Colors.blue,
      alignment: Alignment.center,
      width: double.infinity,
      height: 100.0,
      child: AspectRatio(
        aspectRatio: 16 / 9,
        child: Container(
          color: Colors.green,
        ),
      ),
    );

Baseline

根据子组件的基线定位子组件位置。

  • 属性

属性

含义

示例

baseline

baselineType

child

示例:

代码语言:javascript复制
BaseLine(
    baseline:100,
    baselineType:TextBaselIST.alphabetic,
    child:MyText()
)

ConstrainedBox 组件

对其子级施加附加约束的小部件。

例如,如果希望子对象的最小高度为50.0个逻辑像素,可以使用const-BoxConstraints(minHeight:50.0)作为约束。

  • 属性

属性

含义

示例

constraints

child

示例:

代码语言:javascript复制
ConstrainedBox(
  constraints: const BoxConstraints.expand(),
  child: const Card(child: Text('Hello World!')),
)

Padding 组件

  • 属性

属性

含义

示例

padding

child

示例:

代码语言:javascript复制
const Card(
  child: Padding(
    padding: EdgeInsets.all(16.0),
    child: Text('Hello World!'),
  ),
)

SizedBox 组件

指定大小的盒子。

  • 属性

属性

含义

示例

height

width

示例:

代码语言:javascript复制
const SizedBox(
  width: 200.0,
  height: 300.0,
  child: Card(child: Text('Hello World!')),
)

Transform 组件

在绘制其子级之前应用转换的小部件。

  • 属性

属性

含义

示例

alignment

filterQuality

origin

transform

transformHitTests

示例:

代码语言:javascript复制
Container(
  color: Colors.black,
  child: Transform(
    alignment: Alignment.topRight,
    transform: Matrix4.skewY(0.3)..rotateZ(-math.pi / 12.0),
    child: Container(
      padding: const EdgeInsets.all(8.0),
      color: const Color(0xFFE8581C),
      child: const Text('Apartment for rent!'),
    ),
  ),
)

dio get请求的简单示例代码

代码语言:javascript复制
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';

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

  @override
  Widget build(BuildContext context) {
    getHttp();
    return Scaffold(
      body: Center(
        child: Text('terrence home page')),
    );
  }

  // request
  void getHttp() async {
    try{
      Response response;
      response = await Dio().get('https://mock.mengxuegu.com/mock/629782a36163854a32e82a09/shop/homepage');
      return print(response);
    }catch(e){
      return print(e);
    }
  }
}

学习flutter的一些建议

可以先看中文文档,然后读官网原版,体会一下组件以及各个库的使用方法。

最好也看一遍dart语言的官网,了解dart的基本类型,变量定义,函数定义,条件语句等基本操作。

其次最好找一个科学上网工具,因为在我们实际写代码的过程中,有些依赖包在flutter最新的版本中需要代理才能正常安装,如果没有科学上网工具,我们只能望洋兴叹。

0 人点赞