其他分享
首页 > 其他分享> > Flutter学习-flutter开发初体验

Flutter学习-flutter开发初体验

作者:互联网

Flutter学习-flutter开发初体验

1. flutter项目的创建

1.1 创建方式

在这里插入图片描述

1.2 默认程序分析

在这里插入图片描述

2. 编写flutter代码

需求:在界面中心位置,显示一个Hello World

2.1 helloworld的实现

import 'package:flutter/material.dart';//导入对应的库

//main函数作为程序的入口
void main() {
  runApp(
      Text(
        "hello world",
        textDirection: TextDirection.ltr,//设置文字的显示方向, 如果不设置方向会报错
        style: TextStyle(
          fontSize: 30
        ),
      )
  );
}

在这里插入图片描述

2.2 代码分析

2.2.1 runApp和Widget

void runApp(Widget app) {
  WidgetsFlutterBinding.ensureInitialized()
    ..scheduleAttachRootWidget(app)
    ..scheduleWarmUpFrame();
}

2.2.2 Material设计风格

class Text extends StatelessWidget {
  const Text(
    this.data, { //data 为必传参数 其它都是命名可选参数
    Key key,
    this.style,
    this.strutStyle,
    this.textAlign,
    this.textDirection,
    this.locale,
    this.softWrap,
    this.overflow,
    this.textScaleFactor,
    this.maxLines,
    this.semanticsLabel,
    this.textWidthBasis,
  });
}
abstract class StatelessWidget extends Widget {
	// ...省略代码
}

2.3 代码改进

2.3.1 改进界面样式

import 'package:flutter/material.dart';//导入对应的库

//main函数作为程序的入口
void main() {
  runApp(
      Center( // 居中小部件
        child: Text(
          "hello world",
          textDirection: TextDirection.ltr,//设置文字的显示方式
          style: TextStyle(
              fontSize: 30 //设置字体大小
          ),
        ),
      )
  );
}

运行效果如下:
在这里插入图片描述

2.3.2 改进界面结构

目前我们虽然可以显示HelloWorld,但是我们发现最底部的背景是黑色,并且我们的页面并不够结构化。 正常的App页面应该有一定的结构,比如通常都会有导航栏,会有一些背景颜色

flutter开发当中,我们并不需要从零去搭建这种结构化的界面,我们可以使用Material库,直接使用其中的一些封装好的组件来完成一些结构的搭建。

我们通过下面代码来实现:

import 'package:flutter/material.dart';//导入对应的库

//main函数作为程序的入口
void main() {
  runApp(
      MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text(
              "Hello Flutter"
            ),
          ),
          body: Center(
            child: Text(
              "hello world",
              textDirection: TextDirection.ltr,//设置文字的显示方式
              style: TextStyle(
                  fontSize: 30 //设置字体大小
              ),
            ),
          ),
        )
      )
  );
}

运行效果图如下:
在这里插入图片描述

2.3.3 进阶案例实现

我们可以让界面中展示更多的界面元素

import 'package:flutter/material.dart';//导入对应的库

//main函数作为程序的入口
void main() {
  runApp(
      MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text(
              "Hello Flutter"
            ),
          ),
          body: Center(
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,//设置主轴居中
              children: [
                Checkbox(value: true,
                    onChanged: (value){
                      print("checkbox  点击事件");
                }),
                Text(
                  "同意协议",
                  textDirection: TextDirection.ltr,//设置文字的显示方式
                  style: TextStyle(
                      fontSize: 30 //设置字体大小
                  ),
                ),
              ],
            )
          ),
        )
      )
  );
}

运行效果:
在这里插入图片描述

2.4 代码重构

2.4.1 创建自己的Widget

我们可以发现上面的代码嵌套已经很多,很多学习Flutter的人,都会被Flutter的嵌套劝退,当代码嵌套过多时,结构很容易看不清晰。

在上述案例中对代码的重构我们使用StatelessWidget即可

2.4.2 StatelessWidget

class MyStatelessWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return <返回我们的Widget要渲染的Widget,比如一个Text Widget>;
  }
}

2.4.3 重构案例代码

我们可以通过StatelessWidget对我们的代码进行重构

import 'package:flutter/material.dart';//导入对应的库

//main函数作为程序的入口
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text(
                "Hello Flutter"
            ),
          ),
          body: GYHomeContent()
        )
    );
  }
}

class GYHomeContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Center(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,//设置主轴居中
          children: [
            Checkbox(value: true,
                onChanged: (value){
                  print("checkbox  点击事件");
                }),
            Text(
              "同意协议",
              textDirection: TextDirection.ltr,//设置文字的显示方式
              style: TextStyle(
                  fontSize: 30 //设置字体大小
              ),
            ),
          ],
        )
    );
  }
}

2.4.4 实现checkBox的状态改变

有得人可能想这样实现(错误代码):

class GYHomeContent extends StatelessWidget {
  var flag = true;
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Center(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,//设置主轴居中
          children: [
            Checkbox(value: flag,
                onChanged: (value){
                  flag = value; //报错
                  print("checkbox  点击事件 $value");
                }),
            Text(
              "同意协议",
              textDirection: TextDirection.ltr,//设置文字的显示方式
              style: TextStyle(
                  fontSize: 30 //设置字体大小
              ),
            ),
          ],
        )
    );
  }
}

上述代码定义一个变量是错误的写法, 我们可以看到该类的父类是 使用 @inmutable 这个注解标注过, 表示这个类是不可变的, 该注解主要的作用是,修改的当前的类是不可变的 ,一旦创建完成里面所有的东西都是不可变的,里面定义的所有的东西, 属性都是final的,所以里面定义的属性都必须使用final来修饰

所有的Widget里面都是不可以写状态代码的,因为@inmutable修饰的Widget,所以所有的Widget都是不可变的

import 'package:flutter/material.dart';//导入对应的库

//main函数作为程序的入口
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text(
                "Hello Flutter"
            ),
          ),
          body: GYHomeContent()
        )
    );
  }
}

class GYHomeContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return GYHomeContentBody();
  }
}

// StatefullWidget: 继承自StatefulWidget的类(可以接收父Widget传过来的数据)/State类(状态)
// flag: 状态
// Stateful不能定义状态 -> 创建一个单独的类, 这个类负责维护状态
class GYHomeContentBody extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return GYHomeContentBodyState();
  }
}

class GYHomeContentBodyState extends State<GYHomeContentBody> {
  var flag = true;
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Center(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,//设置主轴居中
          children: [
            Checkbox(value: flag,
                onChanged: (value){
                  setState(() {
                    flag = value ?? true; //因为value是bool? 类型所以需要处理下
                  });
                  print("checkbox  点击事件 $flag");
                }),
            Text(
              "同意协议", style: TextStyle(
                  fontSize: 30 //设置字体大小
              ),
            ),
          ],
        )
    );
  }
  
}

运行打印效果:

在这里插入图片描述

3. 案例练习

这个案例中可能有用到了一些我们不熟悉的Widget,该案例的主要目的还是让我们更加熟悉Flutter的开发模式以及自定义Widget的封装过程;

3.1 自定义Widget

//定义一个Item
class GYProductItem extends StatelessWidget {
  final String title;
  final String desc;
  final String imageURL;

  //定义一个初始化方法
  GYProductItem(this.title, this.desc, this.imageURL);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Column(
      children: [
        Text(title, style: TextStyle(fontSize: 24)),
        Text(desc, style: TextStyle(fontSize: 18)),
        Image.network(imageURL)
      ],
    );
  }

3.2 列表数据展示

class GYHomeContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Column(
      children: [
        GYProductItem("Apple1", "Macbook Product1", "https://tva1.sinaimg.cn/large/006y8mN6gy1g72j6nk1d4j30u00k0n0j.jpg"),
        GYProductItem("Apple2", "Macbook Product2", "https://tva1.sinaimg.cn/large/006y8mN6gy1g72imm9u5zj30u00k0adf.jpg"),
        GYProductItem("Apple3", "Macbook Product3", "https://tva1.sinaimg.cn/large/006y8mN6gy1g72imqlouhj30u00k00v0.jpg")
      ],
    );
  }
}

运行效果如下:
在这里插入图片描述

在这里插入图片描述

3.3 案例的细节调整

最终实现代码:

import 'package:flutter/material.dart';//导入对应的库

//main函数作为程序的入口
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text(
                "Hello Flutter"
            ),
          ),
          body: GYHomeContent()
        )
    );
  }
}

class GYHomeContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: ListView(
        children: [
          GYProductItem("Apple1", "Macbook Product1",
              "https://tva1.sinaimg.cn/large/006y8mN6gy1g72j6nk1d4j30u00k0n0j.jpg"),
          GYProductItem("Apple2", "Macbook Product2",
              "https://tva1.sinaimg.cn/large/006y8mN6gy1g72imm9u5zj30u00k0adf.jpg"),
          GYProductItem("Apple3", "Macbook Product3",
              "https://tva1.sinaimg.cn/large/006y8mN6gy1g72imqlouhj30u00k00v0.jpg")
        ],
      ),
    );
  }
}

//定义一个Item
class GYProductItem extends StatelessWidget {
  final String title;
  final String desc;
  final String imageURL;

  //定义一个初始化方法
  GYProductItem(this.title, this.desc, this.imageURL);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      padding: EdgeInsets.all(20),
      decoration: BoxDecoration(
        border: Border.all()
      ),
      child: Column(
        children: [
          Text(title, style: TextStyle(fontSize: 24)),
          Text(desc, style: TextStyle(fontSize: 18)),
          Image.network(imageURL)
        ],
      ),
    );
  }
}

标签:Widget,初体验,Text,flutter,StatelessWidget,build,我们,Flutter
来源: https://blog.csdn.net/yong_19930826/article/details/118674879