前端工作周报 8.16 & 8.23

本文详细记录了作者从安装Dart SDK开始,逐步学习Dart语言的过程,包括变量、数据类型、运算符、集合、映射等基础知识,并探讨了类型检查、可选参数和泛型等内容。随后,作者转向Flutter,介绍了Flutter环境配置、 HelloWorld程序及基本Widget的使用,如AppBar、Scaffold、Container等,并展示了图片加载和列表展示的示例。
摘要由CSDN通过智能技术生成

本应两周写两个周报,但在上周主管和我说不用干vue了,需要学习dart->flutter。这两周主要是在学习,这个博客会贴很多平时联系的代码。

8.16 - 8.17

  1. Dart 安装

    • 下载SDK
    • 配置环境
  2. helloworld

  3. 学习笔记

    • 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);  }}//泛型接口
      
    • 
      
  4. 问题

    • ??运算符在我的环境中全部报错
    • 可选参数,默认参数,命名参数,改了
    • Mixins 类似多重继承
    • 系统内置库
    • Pub 包管理工具
    • 库的重命名 as

8.17 flutter

  1. 安装

    • 下载SDK
    • 配置镜像
    • 配置环境
    1. helloworld

    2. 学习笔记

      • 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'),        )      ],    );  }}
      
      
      
    3. 问题

      • 网格以及其他布局先跳过
      • 如果滚动视图设置的是false,那么内容会在滚动方向上尺寸延伸到最大,如果在滚动方向上没有边界约束,那么shrinkWrap必须设置为true
      • 抽离代码, 基本逻辑和vue差不多
      • 普通路由跳转
      • 命名路由传值
      • 底部导航栏的路由切换
      • tab栏
      • toast 背景色和位置不正确
      • 表单的验证
      • expanded 与web的flex布局相似,重要参数有:flex,child
      • 宽度总是超出
      • Row中嵌套GridView,报错,在后者中加shrinkWrap: true即可。 为何????
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值