Flutter开发进阶:项目创建及Widget布局

flutter是一款移动应用跨平台框架,使用Dart语言编写的一份代码可以生成iOS和Android两个高性能、高保真的应用程序。Flutter不借助原生的渲染能力,而是自己实现了一套与Android和iOS一样的渲染原理,从而在性能上与原生平台基本保持一致。目前Flutter支持了iOS、Android,Windows、linux、macOS、Web平台的运行。

1、项目创建

开发flutter应用,我们通常使用的工具是Android Studio。创建一个flutter项目,可以通过Android Studio来创建,也可以通过命令行来创建。

1.通过Android Studio来创建
  • 启动Android Studio,找到Create New Flutter Project
  • 然后会来到一个让选择项目类型的页面Flutter ApplicationFlutter PluginFlutter PackageFlutter Module;选择Flutter Application
  • 输入Project nameFlutter SDK pathProject location信息,点击下一步,然后等待一小会即可创建成功。

注意事项:
1.Flutter Application-全新的App,包含标准的DartNative层;Flutter Module-混编到已有的Android/iOS工程内;Flutter Plugin-平台插件,包含DartNative层的实现;Flutter Package-纯Dart工程,仅有Dart层实现。
2.需要注意的是Project name只能只用小写字母或者下划线;

2.通过命令行创建
/*创建Flutter Application*/
flutter create  appname
/*创建Flutter Module*/
flutter create -t module appname_module
/*创建Flutter Plugin*/
flutter create --template=plugin appname_plugin
/*创建Flutter Package*/
flutter create --template=package appname_package

在创建项目的过程中可以指定AndroidiOS的平台开发语言:-i objc-i swift可指定iOS平台是OC还是Swift;-a java-a kotlin可指定AndroidJava还是Kotlin。更多选项可以通过flutter create --help来查看。

创建好的项目,包括android,ios,lib等目录,main函数和我们开发写的Dart代码都在lib目录中。

2、基础语法

基础类型:

- num
  包括int & double
  int.isEven, int.isOdd;
  int.toDouble;double.toInt();
  double.round();//常用函数
- String:
  var a = "today";var b = "hello", var c = a + b; //字符串拼接
  a[0];//取第一个字符; a*2;//字符串a的内容重复2遍
  print("a + b = ${ a + b}")//{放运算表达式}
- list
  创建可变list: var  list = [1,2,3,"name"]
  创建不可变list:var list = const [1,2,3,"name"]
  按下标访问list[2]="xyz"
  添加/删除元素list.add("xxx"); list.insert(1,"cat");list.remove("cat");list.clear();
  排序:list.sort()
  截取:list.sublist(5,7)//从4到7,前闭后开,包含3个元素
- Map
   创建可变Map: var map = {"name":"ccc", "age":244};
   创建不可变Map:var map =const  {"name":"ccc"};
   按键访问 map["name"] = "520";
   var list = ["ccc", "255"]; list.asMap()//{0:"ccc", 1:244}
- ??=, ??
  var a; a ??= 5; a=10; //如果a为nil就赋值,否则直接返回
  var b; print("${b ?? 5}")//如果b有值,直接返回,反之取??后面的
- =>箭头函数
- 可选参数,空安全
- 匿名函数
- 闭包:定义在函数里面的的函数就是闭包,闭包也是一个对象,可以访问外部函数的局部变量。

func() {
  int count = 0;
  return ()=>print(count++);
}

let func1 = func();
func1();func1();func1();func1();//分别打印1/2/3/4
let func2 = func();
func2();func2();func2();func2();//分别打印1/2/3/4

flutter项目使用的dart语言,其基础语法与SwiftKotlin非常接近。
接下来我们简单列举一个例子,定义一个Worker

class Worker {
  //定义静态变量:格式:类型 变量名 = 初始值
  //在外部通过 = Worker.key; Worker.key = "22"进行读写 (类似于swift的 static var key = "worker")
  //在内不通过 = key;key = ""进行读写
  //static String _i = "111";如果带下划线将不能被外部访问
  static String key = 'Worker';

  //定义成员变量:格式:类型 变量名 = 初始值
  //如果成员变量不给初始值,那么需要指定该成员变量是空安全(null-safety,跟swift的可选类型类似)或者指定为构造函数参数
  //如果成员边量带下划线,表示该成员变量尽在该文件内可以访问。(跟swift的fileprivate类似)
  //const常量:在编译期确定变量测值,不可用运行态的内容来赋值,如时间戳/随机数;赋值后不可修改。在申明的时候就需要赋值。
  //final最终变量:赋值一次后不可以改变,可以赋值为时间戳和随机数等。如果没有赋值不能使用。
  String name = '';
  String _nickname = '';
  int? height;////未初始化的变量指向null
  int? age;//未初始化的变量指向null

  //构造函数
  //同名的参数(可以简写成如下方式,私有成员变量不可以)
  Worker(this.name,this.height, String _nickname){
    this._nickname = _nickname;
  }

  //函数:返回值 函数名 (参数列表)
  //带前置下划线的函数不能被外部访问,与带下划线的的成员变量相同
  int printAll() {
    print(
        'printAll:key=$key, name=$name, _nickname=$_nickname, height=$height, age=$age');
    return 8;
  }

  int _printAll(){
    print('_printAll:key=$key, name=$name, _nickname=$_nickname, height=$height, age=$age');
    return 9;
  }
}

调用部分如下:

void main() {
  Worker.key = "222";
  print(Worker.key);
  Worker worker = Worker("name", 19, "nickname");
  worker.printAll();
}

3.基础结构

flutter项目从main启动后,调用runApp(),即可将UI载入:

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

//在widget中我们重载Widget build(BuildContext context)函数,返回创建的widget
class TextWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(44),
      color: Colors.yellow,
      child: Text(
          "Hello Flutter",
          textAlign:TextAlign.center,/*文本居中显示*/
          textDirection:TextDirection.ltr,/*文字阅读顺序*/
          style: TextStyle(
          color: Colors.red,/*文字颜色*/
          fontSize: 40/*文字大小*/
        )
      )
    );
  }
}

flutter中MaterialApp代表Material Design风格的应用,内部包含该风格应用所需要的基本控件, 其home属性应用的根节点。Scaffold名为脚手架,为应用提供了导航栏、Tab等:

  • appBar:导航栏NavigationBar位居页面最顶部
  • bottomNavigationBar:标签栏Tabbar,位居页面最底部
  • body:除appBar/bottomNavigationBar以外的屏幕中间区域
    接下来,我们把这些基础组建给弄出来看看:
void main() {
  runApp(const App());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        debugShowCheckedModeBanner:false,
        home: Scaffold(
            appBar: AppBar(
                title: Text('Explorer App')
            ),
            body: TextWidget()
        )
    );
  }
}

这样我们后面做基础组建的学习只需要修改Scaffold.body即可。

4.布局控件

在原生开发中我们常用frame、AutoLayout布局,在h5项目中我们常用flex布局。在flutter开发中,Dart为我们提供了类似flex布局RowColumnStack等。

4.1 RowColumn表示一组平面上排列的元素

其中Row主轴mainAxisAlignment是从屏幕左侧到右侧,交叉轴从屏幕顶部到下方;Column主轴crossAxisAlignment从屏幕的上方到下方,交叉轴是从屏幕的左侧到右侧。

  • mainAxisAlignment变量-主轴

start-元素居左/居上显示,元素之间间距为0,多余的空间居右/下;
center-元素居中显示,元素间艰巨为0,多余的空间一分为二居左右/上下;
end-元素居右/下显示,元素之间间距为0,多余的空间居左/上;
spaceBetween-元素分开显示,多余的空间分配到元素与元素之间;
spaceAround-整体空间按照元素的个数均分,多余的空间显示在元素的左右/上下两侧;
spaceEvenly-将多余的空间均分于左+元素之间+右/上+元素之间+下;


Row布局(cross轴为center)

Column布局(cross轴为center)
  • CrossAxisAlignment变量-交叉轴:

start:元素居上/左显示;
center:元素居上下居中/左右居中;
end:元素居下/右显示
stretch:元素拉伸
baseline:用于Text基线对齐


Row布局(main轴为center)

Column布局(main轴为center)

Row布局的主轴为x+方向,交叉轴为y+方向;Column的主轴为y+方向,交叉轴为x+方向。搞清楚这两个最常用的布局,开发中如鱼得水。

4.2.Stack一组垂直于屏幕排列的元素,

整组处于父容器中的位置通过alignment来确定,alignment接受一个AlignmentDirectional类型的对象,该对象两个属性start,y分别表示处在x轴,y轴上的位置。内部定义父视图x轴方向起点为-1,中点为0,右侧为1,父视图y轴方向起点为-1,中点为0,右侧为1。该类也有一些常用的位置定义,比如

/// The center point, both horizontally and vertically.
  ///
  /// Consider using [Alignment.center] instead, as it does not need to
  /// be [resolve]d to be used.
  static const AlignmentDirectional center = AlignmentDirectional(0.0, 0.0);

该布局用起来相对简单:


Stack布局

5.继承、混入

abstract class Worker {
   void work(){print("Person->work");}
}

mixin MixinWorker implements Worker {
  void mixinWork(){print("MixinWorker->mixinWork");}
}

extension ExtensionWorker on Worker {
  void extensionWork(){print("ExtensionWorker->extensionWork");}
}

class Developer extends Worker {
  void develop(){print("Developer-> develop");}
   @override work(){print("Developer-> work");}

  //__test(){
      Developer d = Developer("", 0, "");
      d.work();
      d.delelop();
      d.extensionWork();
      //d.mixinWork();//error
 }
}





最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容