本应两周写两个周报,但在上周主管和我说不用干vue了,需要学习dart->flutter。这两周主要是在学习,这个博客会贴很多平时联系的代码。
8.16 - 8.17
-
Dart 安装
- 下载SDK
- 配置环境
-
helloworld
-
学习笔记
-
PS:很多与js相同的语法默认忽略
-
//void可选,表示无返回值 void main(){ var str = '你好'; //var 会自动类型推断 var num = 1234; String str1 = '世界'; int num1 = 2345; // num = '1234'; str = 123 //String a = 123; int b = '123' //报错,类型检查 print(str); print(num); print(str1); print(num1); }
-
main(){ //二者都是常量,const是编译时常量,给到的必须是一个确认的值;final是运行时常量,可以经过计算 //const PI = 3.14159; final PI = 3.14159; final num = x(); const num1 = x(); //报错 print(num); print(PI); } int x(){ return 1; }
-
main(){ //1. 字符串类型 //三单引号或三双引号,就是多行字符串 String str = '''row1 row2 fds dhs --- \n111'''; //字符串拼接 String str1 = '多行字符串'; print('$str1:$str'); print('${str1}: $str'); print(str1+':'+str); //2. 数值类型 int count = 1; double price = 99.9; //count = 1.0; 报错,int只能是整型,double可以用整型赋值,自动加.0 price= 100; //3. 运算符 +-*/% 同其他语言 ~/取整 13~/5 = 2 //4. 布尔值 bool flag = true; flag = false; //flag = 123; 报错 if(flag){ print('true'); }else{ print('false'); } int a = 12; // String b = '12'; 不相等, == 没有隐式类型转换 double b = 12.0; if(a == b){ print('a=b'); }else{ print('a!=b'); } //5. array/list 集合(数组) var list1 = ['123',123,true]; //使用 [] 创建的集合可以扩充容量,长度可变. print(list1.length); print(list1[0]); // list1.length = 4; // 不能通过增加length扩充容量 list1.length = 2; print(list1); //指定集合类型 var list2 = <double>[11,2.3,33]; // 集合方法 //list2.add('11'); 报错 list2.add(23); //集合创建方法 var list3 = List.filled(3, 1);//arg1为集合长度,arg2为填充内容,填充值有类型检查。 //list3[0]='11'; 报错 list3[0] = 12; //list3.add(12); 报错,这种方式定义的集合不能扩充容量,长度是固定的。 //list3.length = 3; 报错,即使是与指定长度相同。 print(list3); //6. maps(类似json) var person = { 'name':'1', 'age':12, 'pet':{ 'type':'cat', 'name':'mei_mei' } }; //print(person.name) 报错 print(person['name']); person['job'] = 'it'; print(person); //is 判断 类型 var foo = '1'; if(foo is String){ print('string'); }else{ print('else'); } }
-
int num_null=3; num_null??= 23; //如果该值为空,则执行赋值;不为空则忽略。(我这个环境下运算符报错) print(num_null);
-
main(){ String str = '12'; String str1 = '12.1'; String str2 = ''; print(double.parse(str)); print(double.parse(str1)); try{ print(double.parse(str2)); //报错 }catch(e){ print(e); } print(int.parse(str)); //print(int.parse(str1)); 报错 //print(int.parse(str2)); 报错 }
-
String str = '12'; String str1 = '12.1'; String str2 = ''; print(double.parse(str)); print(double.parse(str1)); try{ print(double.parse(str2)); //报错 }catch(e){ print(e); } print(int.parse(str)); //print(int.parse(str1)); 报错 //print(int.parse(str2)); 报错 int num = 123; String str3 = num.toString(); if(str3 == '') { print('空'); }else{ print('非空'); } //这两段代码等效 if(str3.isEmpty){ print('空'); }else{ print('非空'); } var num1 = 2/0; print(num1.isNaN); //false
-
//打印[0,50]的偶数 // for (int i = 0; i <=50; i++){ // if (i % 2 == 0) print(i); // } //1-10的和 // int sum = 0; // for (int i = 1; i <= 10; i++){ // sum += i; // } // print(sum); //5的阶乘 // int res = 1; // for (int i = 1; i <= 5; i++){ // res *= i; // } // print(res); //打印集合 // List list = [ // { // 'id':1 // }, // { // 'id':2 // }, // { // 'id':3 // }, // { // 'id':4 // } // ]; // // for (int i = 0; i < list.length; i++){ // print(list[i]['id']); // } //break和continue 同其他语言
-
List list = [1,2,3]; print(list.reversed.toList()); //反转数组 list.add('newValue'); //添加一项 list.addAll([4,5,6]); //添加多项,拼接数组 print(list); print(list.indexOf(1)); //查找索引,没有返回-1 list.remove(-1); //删除具体值,没有这个值则忽略 // list.removeAt(1); //删除索引对应值,索引值越界则报错 list.fillRange(3, 4,'changed'); // [start,end),索引值越界则报错,start > end 报错,start = end 忽略 list.insert(1, 3); //在索引值1前插入值,索引值越界则报错 list.insertAll(1, ['insert','insert1']); //在索引值1前插入值,索引值越界则报错 String str = list.join(' '); //同js List list1 = str.split(' '); //同js
-
Set set = new Set(); //去重,与js用法相似List myList = [1,2,3,4,5,1,2,3,4,5,1,1,1];set.addAll(myList);List myList1 = set.toList();print(set);print(myList1);
-
Map map = { 'name':'zed', 'age':18, 'gender':1};print(map.containsKey('name'));print(map.containsValue(13));map.remove('age');map.addAll({ 'job':['nodejs','vue','flutter'], 'height':'183'}); //增加多个,合并mapprint(map.keys);print(map.values.toList());print(map.isEmpty);print(map.isNotEmpty);
-
List list = [1,2,3,4];// for(var item in list){// print(item);// } //forEach当循环List时,其中的回调函数只能接收一个参数,元素的值;set和map为key,val// list.forEach((element) {// print(element);// }); //map// List newList = list.map((e){// return e * 2;// }).toList(); print(newList); //where (js中的filter)// List newList = list.where((element) => element % 2 == 0).toList();// print(newList); //any (js中的some) //every (js中的every)
-
main(){ Person p1 = new Person('zed', 18); //级联操作,连缀操作 .. p1..age = 22 ..sayHello() ..getInfo(); Person p2 = new Person.consFunc2(); p2.sayHello(); p2.getInfo();}//私有方法和属性,命名前加_;getter和setter访问类似属性。//初始化列表,相当于属性的默认值。//static 静态方法,静态属性,静态方法中不能访问非静态属性。class Person{ String name= ''; int age = 0; //默认构造函数 Person(this.name,this.age); //命名构造函数,可以有多个 Person.consFunc1(){ print('你好'); } Person.consFunc2(){ print('你好啊'); } void sayHello(){ print('${this.name}在和你打招呼'); } void getInfo(){ print('${this.name} --- ${this.age}'); }}
-
main(){ Person p1 = new Person('zed', 18); Person p2 = new Person.consFunc2(); Student s1 = new Student('joe', 22, 99); Student s2 = new Student.con1(98); s1.getStudentInfo(); s2.sayHello(); s1.runPerSayHello(); print(Person.perCount); Person.getPerCount(); p1.sayHello();}class Person{ static int perCount = 0; String name= ''; int age = 0; //默认构造函数 Person(this.name,this.age){ perCount++; } //命名构造函数,可以有多个 Person.consFunc1(){ print('你好'); perCount++; } Person.consFunc2(){ print('你好啊'); perCount++; } static void getPerCount(){ print(perCount); } void sayHello(){ //非静态属性可以不用this。但为了区别静态属性,最好加上。 print('现在一共有${perCount}人,${this.name}在和你打招呼'); } void getInfo(){ print('${this.name} --- ${this.age}'); }}class Student extends Person { double score; //初始化列表,调用super Student(String name,int age,this.score): super(name,age){ } //命名构造函数传参 Student.con1(this.score): super.consFunc1(){ } void getStudentInfo(){ print('${this.name}-${this.age}-${this.score}'); } @override //可加可不加,建议写 void sayHello() { print('现在一共有${Person.perCount}人,${this.name}在和你打招呼,TA的分数为${this.score}'); } void runPerSayHello(){ //调用父类方法 super.sayHello(); }}
-
main(){ //抽象类,多态, 接口(实现关键字 implements) //Person p = new Person() 报错,抽象类无法实例 Student s = Student(); //new 可以省略 Teacher t = Teacher(); s.sayHello(); t.sayHello(); s.doHomeWork(); t.CheckWork(); Person s1 = Student(); //让子类只有抽象类标准化的东西 //s1.doHomeWork(); 不存在 s1.sayHello();}abstract class Person{ void sayHello();}abstract class Test{ void run();}class Student implements Person { @override void sayHello() { // TODO: implement sayHello print('你好,我是个学生,v我3000'); } void doHomeWork(){ print('做作业很累'); }}class Teacher implements Person { @override void sayHello() { // TODO: implement sayHello print('你好,我是个教师,我有寒暑假^^'); } void CheckWork(){ print('当老师也很累...'); }}// 一个类实现多个接口class Someone implements Person,Test{ @override void run() { // TODO: implement run } @override void sayHello() { // TODO: implement sayHello }}
-
main(){ print(func(1)); print(func<String>('2')); //List.filled()就是一个命名构造参数,List是一个泛型类。 List list = new List<int>.filled(2, 2); MyList ml = MyList<int>(); //ml.addItem('1'); 报错 ml.addItem(1); print(ml.list);}//泛型方法,如不想验证返回值则把首个T删除;是个大写字母都可以,不限于TT func<T>(T arg){ return arg;}//泛型类class MyList<T>{ List list = <T>[]; void addItem(T arg){ this.list.add(arg); }}//泛型接口
-
-
-
问题
??
运算符在我的环境中全部报错- 可选参数,默认参数,命名参数,改了
- Mixins 类似多重继承
- 系统内置库
- Pub 包管理工具
- 库的重命名 as
8.17 flutter
-
安装
- 下载SDK
- 配置镜像
- 配置环境
-
helloworld
-
学习笔记
- PS:没安装全环境
import 'package:flutter/material.dart'; void main(){ //给runApp传入一个根组件(widget) runApp(MyApp()); } //StatelessWidget,无状态的widget class MyApp extends StatelessWidget { @override //主要任务是实现build函数,build返回一个widget Widget build(BuildContext context) { //为了继承主题数据,根widget需要位于MaterialApp内才能正常显示 return MaterialApp( home: Scaffold( appBar: AppBar( title: Text( 'Flutter App By Zed', style: TextStyle( color: Colors.yellow ), ), ), body: HomeContent(), ), ); } } class HomeContent extends StatelessWidget{ @override Widget build(BuildContext context) { // TODO: implement build return Center( child: Text( 'HelloWorld', textDirection: TextDirection.ltr, style: TextStyle( color: Colors.cyan, fontSize: 30 ), ), ); } }
import 'package:flutter/material.dart'; void main()=>runApp(MyApp()); class MyApp extends StatelessWidget{ @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Flutter App By Zed'), ), body: HomeContent(), ), ); } } class HomeContent extends StatelessWidget{ @override Widget build(BuildContext context) { // TODO: implement build return Center( child: Container( child: Text( '你好,我是Flutter!你好,我是Flutter!', overflow: TextOverflow.ellipsis, textAlign: TextAlign.left, style: TextStyle( fontSize: 18, fontWeight: FontWeight.w400, color: Colors.deepPurple, decoration: TextDecoration.underline, decorationColor: Colors.white, decorationStyle: TextDecorationStyle.solid, ), ), width: 200, height: 200, padding: EdgeInsets.fromLTRB(10, 10, 0, 0), decoration: BoxDecoration( color: Colors.lightBlueAccent,//背景色 border: Border.all( color: Colors.black, width: 2, ), borderRadius: BorderRadius.all( Radius.circular(10), ) ), ) ); } }
class HomeContent extends StatelessWidget{@overrideWidget build(BuildContext context) { // TODO: implement build return Center( child: Container( width: 200, height: 200, // padding: EdgeInsets.fromLTRB(10, 10, 0, 0), decoration: BoxDecoration( color: Colors.lightBlueAccent,//背景色 border: Border.all( color: Colors.black, width: 2, ), borderRadius: BorderRadius.circular(100), image: DecorationImage( image: NetworkImage('https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F9ac7ed61d682e2892b7b8488d04b097ed15ebd0d28d92-uLwuPS_fw658&refer=http%3A%2F%2Fhbimg.b0.upaiyun.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631778593&t=46330a6c8eb532971d95950f2a5fe494'), fit: BoxFit.cover, ) ), ) );} }
child: ClipOval( child: Image.network( 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F9ac7ed61d682e2892b7b8488d04b097ed15ebd0d28d92-uLwuPS_fw658&refer=http%3A%2F%2Fhbimg.b0.upaiyun.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631778593&t=46330a6c8eb532971d95950f2a5fe494', width: 50, height: 50, fit: BoxFit.cover )),
class NewsList extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return ListView( //children里可以放任何widget children: [ ListTile( title: Text('标题。。。。'), subtitle: Text('二级标题。。'), leading: Image.network('https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F9ac7ed61d682e2892b7b8488d04b097ed15ebd0d28d92-uLwuPS_fw658&refer=http%3A%2F%2Fhbimg.b0.upaiyun.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631778593&t=46330a6c8eb532971d95950f2a5fe494', width: 50,height: 50), ), ListTile( title: Text('标题。。。。'), subtitle: Text('二级标题。。'), leading: Icon(Icons.headset), ) ], ); }}
class NewsList extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build /** * 1. 垂直列表中,widget设置宽度无效,会拉伸为100%;水平列表高度同理。 * 2. 如果想限制列表的高度或宽度,可以使用container包裹,设置其宽高,在其中写ListView即可。 */ return Container( height: 180, child: ListView( scrollDirection: Axis.horizontal, children: [ Container( height: 180, width: 180, color: Colors.deepPurple, ), Container( height: 180, width: 180, color: Colors.lightBlueAccent, ), Container( height: 180, width: 180, color: Colors.orangeAccent, ), ], ), ); }}
class NewsList extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return ListView.builder( //这是一个函数 itemBuilder: _itemBuilder, //这个也要写 itemCount: listData.length, ); } Widget _itemBuilder(context, index) { return ListTile( title: Text(listData[index]['title']), subtitle: Text(listData[index]['author']), ); }}List listData = [ {'title': '走遍万水千山', 'author': '三毛'}, {'title': '走遍万水千山1', 'author': '三毛1'}, {'title': '走遍万水千山2', 'author': '三毛2'}];
class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState();}class _HomePageState extends State<HomePage> { int count = 0; @override Widget build(BuildContext context) { return Column( children: <Widget>[ Chip(label: Text(this.count.toString())), SizedBox( height: 20, ), OutlinedButton( onPressed: () { //调用这个方法才能响应式修改值 setState(() { this.count++; }); }, child: Text('plusOne'), ) ], ); }}
class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState();}class _HomePageState extends State<HomePage> { List list = <String>[]; @override Widget build(BuildContext context) { return Column( children: <Widget>[ ListView.builder( itemCount: this.list.length, itemBuilder: (BuildContext context, int index) { return Container( child: Text('${this.list[index]}'), ); }, shrinkWrap: true), OutlinedButton( onPressed: () { setState(() { this.list.add('item'); }); }, child: Text('addItem'), ) ], ); }}
class _HomePageState extends State<HomePage> { List list = <String>[]; @override Widget build(BuildContext context) { return ListView( children: <Widget>[ Column( children: this.list.map((value) { return ListTile( title: Text(value), ); }).toList()), OutlinedButton( onPressed: () { setState(() { this.list.add('111'); }); }, child: Text('addItem'), ) ], ); }}
-
问题
- 网格以及其他布局先跳过
- 如果滚动视图设置的是false,那么内容会在滚动方向上尺寸延伸到最大,如果在滚动方向上没有边界约束,那么shrinkWrap必须设置为true
- 抽离代码, 基本逻辑和vue差不多
- 普通路由跳转
- 命名路由传值
- 底部导航栏的路由切换
- tab栏
- toast 背景色和位置不正确
- 表单的验证
- expanded 与web的flex布局相似,重要参数有:flex,child
- 宽度总是超出
- Row中嵌套GridView,报错,在后者中加
shrinkWrap: true
即可。 为何????