Flutter入门学习

84 阅读6分钟

Flutter

  • 一、介绍
  • 二、开发环境配置
  • * hello world
    
    • dart开发环境配置
  • 三、dart
  • * 1.变量与常量
    
    • 2.数据类型
    • 3.Function
    • 4.类与继承
    • 5.mixin与抽象类
    • 6.库
    • 7.异步处理
  • 四、widgets
  • * 1.文本和字体
    
    • 2.按钮
    • 3.图片和图标
    • 4.下拉框
    • 5.单选框和多选框
    • 6.输入框
  • 五、布局
  • * 1.线性布局
    
    • 2.弹性布局
    • 3.定位
    • 4.流式布局
  • 六、容器
  • * 1.内边距padding
    
    • 2.布局限制类容器
    • 3.装饰容器
    • 4.变换transform
    • 5.Container
    • 6.可滚动widgets
  • 七、脚手架Scaffold
  • * 1.topBar和底部导航
    
    • 2.TabBar
    • 3.抽屉drawer
  • 八、事件
  • * 1.指针事件
    
    • 2.手势事件
  • 九、网络请求
  • * 1.http请求
    

一、介绍

  • Flutter是Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过Dart语言开发App,一套代码同时运行在iOS和Android平台。Flutter提供了非常丰富的组件、接口,开发者可以很快地为Flutter添加native扩展。同时Flutter还使用Native引擎渲染视图,为用户提供良好的体验。
  • 特点:
    跨平台自绘引擎
    高性能

二、开发环境配置

hello world

  • 为android studio添加Flutter插件
  • 使用android studio开发第一个Flutter应用

dart开发环境配置

下载网址:gekorm.com/dart-window…
dart.dev/get-dart/ar…

三、dart

1.变量与常量

void main(){
  //var声明
  var username="quan";
  username="good";

  // dynamic a="good job";
  // Object b="good job";
  // print(a.length);
  // print(b.length);

  // final psw="good";
  // psw="job";
  //
  // const psw="good";
  // psw="job";
}

2.数据类型

void main(){
  // num: int and double
  int abc=110;
  int a=int.parse('119');

  double cde=220.111;
  double b=double.parse('111.222');

  //String
  String good=123.toString();
  String job=123.22322.toStringAsFixed(2);
  print(job);

  //bool
  //bool result=123>110;
  bool result=1=='1';
  print(result);

  //List 数据类型
  List list=[1,3,5,7,9];

  //List newList=new List();-------已弃用
  //newList.add(2);
  //newList.addAll([4,6,8,10]);//将数组中的所有元素添加进数组中
  //print(newList);
  //print(newList.length);
  //print(newList.first);
  //print(newList.last);
  //print(newList[2])
  
  //Map 对象类型
  Map obj={
    'x':1,
    'y':2,
    'z':3
  };
  // Map obj2=new Map();------已弃用
  // obj2['x']=1;
  // obj2['y']=2;
  print(obj);
  //print(obj2);
  print(obj.containsKey('x'));//是否包含某个key
  print(obj.containsKey('a'));
  obj.remove('y');
  print(obj);
}

3.Function

void main(){
  String username=getUserName();
  String userInfo=getPersonInfo(111);
  print(userInfo);
  int age=addAge(111);
  print(age);
  int age2=addAge2(age1:119);
  print(age2);

  var list=["abc","cde","def"];
  //匿名函数
  list.forEach((str) {
    print(str);
  });
}

String getUserName(){
  return "hello world";
}

String getPersonInfo(int userId){
  Map userInfoObj={
    "111":"zhangsan",
    "222":"lisi"
  };
  return userInfoObj[userId.toString()];
}

//可选参数
int addAge(int age1,[int age2=0]){
  return age1+age2;
}

//默认值
int addAge2({int age1=0,int age2=0}){
  return age1+age2;
}

4.类与继承

void main(){
  var p=new Person(23,"zhangsan");
  // p.age=123;
  print(p.age);
  print(p.name);
  p.sayHello();
  var w=new Worker(18, "lisi", 3500);
  w.sayHello();
}

//类
class Person{
  int age=0;
  String name="";
  //构造函数
  Person(int age,String name){
    this.age=age;
    this.name=name;
  }
  void sayHello(){
    print("my name is:"+this.name);
  }
}

//继承
class Worker extends Person{
  //Worker(super.age, super.name);
  int salary=0;
  //扩展
  Worker(int age,String name,int salary):super(age,name){
    this.salary=salary;
  }
  //重写
  @override//告诉编译器/程序员这是一个重写方法
  void sayHello(){
    super.sayHello();
    print("my salary is:"+this.salary.toString());
  }
}

5.mixin与抽象类

void main(){
  var p=new Person(18,"zhangsan");
  p.eat();
  p.sleep();
  p.sayHello();
}

mixin Eat{
  void eat(){
    print("eat");
  }
  // void sayHello(){
  //   print("say Hello in eat");
  // }
}

mixin Sleep{
  void sleep(){
    print("sleep");
  }
  // void sayHello(){
  //   print("say Hello in sleep");
  // }
}

//抽象类,不能被实例化
abstract class Animal{
  //抽象方法,需在实例中实现
  void have_a_baby();
}

//类
class Person extends Animal with Eat,Sleep{
  int age=0;
  String name="";
  //构造函数
  Person(int age,String name){
    this.age=age;
    this.name=name;
  }
  //混合里如果有同名方法,先找自身类的方法,后找混合的最后一个类的方法
  void sayHello(){
    print("my name is:"+this.name);
  }
  @override
  void have_a_baby() {
    print("have a baby");
  }
}

6.库

外部库需要在pubspec.yaml文件中写明加载依赖,然后在终端执行pub get
外部库网址:pub.dev

dependencies:
  http: ^0.13.3
//自写库
import 'pkg/Calc.dart';
//外部库
import 'package:http/http.dart' as http;
//dart自身库 延时加载
import 'dart:math' deferred as math;

// 如果pub get总是下载失败的话,可以使用国内的镜像
// 设定环境变量:PUB_HOSTED_URL=https://pub.flutter-io.cn
void main () async {
  int result = add(3,4);
  print(result);

  var m=new Calc(10, 5);
  m.minus();

  // var url = Uri.https('example.com', 'whatsit/create');
  // var response = await http.post(url, body: {'name': 'doodle', 'color': 'blue'});
  // print('Response status: ${response.statusCode}');
  // print('Response body: ${response.body}');
  //
  // print(await http.read(Uri.https('www.baidu.com')));
  
  // var r=new Random();
  // print(r.nextInt(10));
  await math.loadLibrary();
  var r=new math.Random();
  print(r.nextInt(10));
}

7.异步处理

void main() async {
	print("sat Hello");
	await Future.delayed(new Duration(seconds: 5),(){
		print("chibaole");
	});
	print("play game");

//	Future.wait([
//		Future.delayed(new Duration(seconds: 1),(){
//			print("001");
//		});
//		Future.delayed(new Duration(seconds: 3),(){
//			print("002");
//		});
//		Future.delayed(new Duration(seconds: 2),(){
//			print("003");
//		});
//	]).then((List results){
//		print("all over");
//	});
	await Future.delayed(new Duration(seconds: 1),(){
		print("001");
	});
	await Future.delayed(new Duration(seconds: 3),(){
		print("002");
	});
	await Future.delayed(new Duration(seconds: 2),(){
		print("003");
	});
}

四、widgets

1.文本和字体

@override
  Widget build(BuildContext context) {
    const styles=TextStyle(
      color: const Color(0xffff0000),//十六进制颜色前两位为透明度,后六位为颜色//Colors.yellow
      fontSize: 20,
      fontFamily: "yahei",
      decoration: TextDecoration.underline,
      decorationStyle: TextDecorationStyle.dashed
    );
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Column(
        children: <Widget>[
          Text("hello worldhello worldhello worldhello worldhello worldhello worldhello world",
            textAlign: TextAlign.center,
            maxLines: 1,
            overflow: TextOverflow.ellipsis,
            textScaleFactor: 1.4,
          ),
          Text("样式测试",
            style: styles,
          ),
          Text.rich(TextSpan(
            children: [
              TextSpan(text:"主页:",
                style: TextStyle(
                  fontSize: 30
                )
              ),
              TextSpan(text:"https://www.baidu.com",
                style: TextStyle(
                  color: Colors.blue,
                  fontSize: 25
                )
              )
            ]
          ))
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

2.按钮

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Column(
        children: <Widget>[
          ElevatedButton(
            child:Text("RaisedButton"),
            onPressed:()=>{
              print("RaisedButton pressed")
            }
          ),
          TextButton(
              child:Text("FlatButton"),
              onPressed:()=>{
                print("FlatButton pressed")
              }
          ),
          OutlinedButton(
              child:Text("OutlinedButton"),
              onPressed:()=>{
                print("OutlinedButton pressed")
              }
          ),
          TextButton(
            onPressed:()=>{
              print("FlatButton pressed")
            },
            style:ButtonStyle(
              backgroundColor: MaterialStateProperty.all<Color>(Colors.blue),
              shape: MaterialStateProperty.all<RoundedRectangleBorder>(
                RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(10.0), // 设置圆角半径
                ),
              )
            ),
            child:Text("FlatButton自定义"),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

3.图片和图标

  1. 加载本地资源
@override
Widget build(BuildContext context) {
	const style = TextStyle(
		color:const Color(0xffff0000),//Colors.yellow
		fontSize:20,
		fontFamily:'yahei',
		decoration: TextDecoration.underline,
		decorationStyle: TextDecorationStyle.dashed
	);
	return Scaffold(
		appBar: AppBar(
			title: Text('Hello world!'),
			actions: <Widget>[
				IconButton(
					icon: Icon(Icons.shopping cart),
					tooltip: 'Open shopping cart',
					onPressed: () {
						print('Shopping cart opened')
					},
				),
			],
		),
		body:Column(
			children: <Widget>[
				Image.asset(static/pircture/mvp.png,
				width:200,
				)//放图片路径,可以右击文件然后新建一个文件夹放图片
			]
		)
	)
}
  1. 加载网络资源
//network代表要使用网络资源
Image.network("http://......",
width:150)
//控制图片填充效果
fit:BoxFit.cover
//设定颜色混合(拿别的颜色混到图片里去)
color:Color.pink,
colorBlendMode:BlendMode.difference,
  1. 图标
    使用icon这个类
    如果图标不够用了,想使用一个新的图标,可以支持icon font(淘宝的矢量图标库)
    解压缩包,找到ttf文件,就是我们要使用库
    在pubspec中引入
    新建一个文件fonts来引入路径
    定义一个自己的图标库,在lib中定义一个Dart File文件叫Myicon.dart
import 'package:flutter/material.dart';
class MyIcon [
	static const IconData huawei = const IconData(
		0xe82e,
		fontFamily:'myGoodIcon',
		matchTextDirection: true
	);
	static const IconData oppo = const IconData(
		0xe82d,
		fontFamily:'myGoodIcon',
		matchTextDirection: true
	);
	static const IconData xiaomi= const IconData(
		0x832,
		fontFamily:'myGoodIcon',
		matchTextDirection: true
	);
]

写完上面代码后,到main.dart文件中引入

import 'MYIcon.dart'

可以设置颜色

Icon(MyIcon.huawei,color:Color.yellow)

pub里面报错的话,可能是缩进问题

4.下拉框

下拉框里面有选项,有选项的话还需要知道选的是第几个,这才是一个真正的下拉框

class MyDropDownButton extends StatefulWidgets {
	@override
	State<StatefulWidget> createState() {
 		return _MyDropDownButton();
	}
}

class _MyDropDownButton extends State<MyDropDownButton> {
	List getCityList() [
		List<DropdownMeunItem> cityList = new List();
		cityList.add(DropdownMenuItem(child: new Text("上海"), value:"shanghai"));
		cityList.add(DropdownMenuItem(child: new Text("北京"), value:"beijing"));
		cityList.add(DropdownMenuItem(child: new Text("广州"), value:"guangzhou"));
		cityList.add(DropdownMenuItem(child: new Text("深圳"), value:"shenzhen"));
		return cityList;
	]
	@override
	Widget build(BuildContext context) {
		return new Column(
			children:<Widget>[
				new DropdownButton(
					items:getCityList(),
					hint: new Text("请选择城市"),
					onChanged: null
				)
			]
		)
	}
}

想要它显示出来,在Scaffold里面添加
还需要写一个变量来存选中的city

class MyDropDownButton extends StatefulWidgets {
	@override
	State<StatefulWidget> createState() {
 		return _MyDropDownButton();
	}
}

class _MyDropDownButton extends State<MyDropDownButton> {
	List getCityList() [
		List<DropdownMeunItem> cityList = new List();
		cityList.add(DropdownMenuItem(child: new Text("上海"), value:"shanghai"));
		cityList.add(DropdownMenuItem(child: new Text("北京"), value:"beijing"));
		cityList.add(DropdownMenuItem(child: new Text("广州"), value:"guangzhou"));
		cityList.add(DropdownMenuItem(child: new Text("深圳"), value:"shenzhen"));
		return cityList;
	]
	var selectedCity;
	@override
	Widget build(BuildContext context) {
		return new Column(
			children:<Widget>[
				new DropdownButton(
					items:getCityList(),
					hint: new Text("请选择城市"),
					value: selectedCity,
					onChanged: (val) {
						setState(() {
							this.selectedCity = val;//把值赋给临时变量
						});
					}
				)
			],
		);
	}
}

5.单选框和多选框

单选框

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Single Selection Example'),
        ),
        body