flutter 学习笔记 第一篇

作者: 草蜢的逆袭 | 来源:发表于2019-08-28 16:12 被阅读0次

flutter_01

一、环境搭建

1) 配置系统环境变量

不配置的话,我们下载sdk得翻墙,要不然网速慢的不要不要的。

image.png

2)下载flutter Sdk

解压到d盘

3) 配置环境FLUTTER_HOME变量

可以不配置,不配置的话,as创建flutter工程的时候,会再次提示你,需要下载flutter<br /> image.pngimage.png image.pngimage.png

这里是添加不是覆盖,需要注意

4) 测试flutter环境

flutter doctor

flutter doctor --android-licenses 证书缺少时运行

image.pngimage.png 关于as版本,只要有一行正常即可,上图上,我们会有不同的版本

二、 知识点

1) 无状态(statelessWidget)&有状态(stateFulWidget)

无: 创建和初始化后,不能再修改它们的内容<br />有:状态是可变的

2) java&dart 方法重载

1. java

public void getName(){}
public void getName(int a){}
public void getName(float b){}
public void getName(int a,float b){}

2.dart

public void getName({int a,float b});

三、flutter示例

1) 基础示例

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: "Wlecome to flutter",
      home: new Scaffold(
        appBar: new AppBar(   // 创建标题栏
          title: new Text("Hello Flutter"),
        ),
        body: new Center(  // 创建中心显示的文本控件
          child: new Text("this is first flutter app , good luck2 ! "),
        ),
      ),
    );
  }
}

2) 文字随机生成并显示

1) english_words 版本获取

资料链接 版本查看与获取

2) 版本依赖与get

1. pubspec.yaml添加

dependencies:
  english_words: ^3.1.5

2. 点击下图中的get即获取包

image.pngimage.png

3) main.dart中代码修改

import 'package:english_words/english_words.dart'; // 1. 导入english_word包
import 'package:flutter/material.dart'; 

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    WordPair wordPair = new WordPair.random(); // 声明引用

    return new MaterialApp(
      title: "Wlecome to flutter",
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("Hello Flutter"),
        ),
        body: new Center(
                    // 调用引用,生成字符串
          child: new Text(wordPair.asLowerCase),
        ),
      ),
    );
  }
}

ctrl+s 热重载

3) 使用有状态的widget对代码进行重构

1. 定义有状态的widget

class RandwordsWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return new RandwordsState();
  }
}

2. 定义状态

class RandwordsState extends State<RandwordsWidget> {
  @override
  Widget build(BuildContext context) {
    WordPair wordPair = new WordPair.random();
    return new Text(wordPair.asLowerCase);
  }
}

3. 原代码修改

import 'package:english_words/english_words.dart'; // 1. 导入english_word包
import 'package:flutter/material.dart'; 

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: "Wlecome to flutter",
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("Hello Flutter"),
        ),
        body: new Center(
                    // 使用有状态的控件,因为这里的原生控件定义之后状态是不能修改的
          child: new RandwordsWidget(),
        ),
      ),
    );
  }
}

4) listview的使用

滚动到底端自动加载更多

1. 数据集合定义和样式定义

// 定义数组: dart中没有List
  var suggestions = <WordPair>[];

  // 定义字体样式
  var fontStyle = const TextStyle(fontSize: 18.0);

2. listview及itemview构建

/*构建listview*/
  Widget buildListView() {
    return new ListView.builder(
        // 设置边距
        padding: const EdgeInsets.all(16.0),
        itemBuilder: (context, index) {
          // 如果index是基数
          if (index.isOdd) {
            // 定义一个分割线
            return new Divider();
          }

          // 向下取取整: 5/2=2.5 取2
          int newIndex = index ~/ 2;
          if (newIndex >= suggestions.length) {
            // 如果条目大于等于了数组的长度再放10条进行,这样就实现了滚动到底部自动加载更多
            suggestions.addAll(generateWordPairs().take(10));
          }
          // 这里使用的是新的索引不是原来的哦
          return buildItemView(suggestions[newIndex]);
        });
  }

  /*构建listview中的itemView*/
  Widget buildItemView(WordPair wordPair) {
    return new ListTile(
        title: new Text(wordPair.asLowerCase, style: fontStyle));
  }

3. 项目完整代码

class RomdomWordsWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new RomdomWordsState();
  }
}

class RomdomWordsState extends State<RomdomWordsWidget> {
  // 定义数组: dart中没有List
  var suggestions = <WordPair>[];

  // 定义字体样式
  var fontStyle = const TextStyle(fontSize: 18.0);

  /*构建listview*/
  Widget buildListView() {
    return new ListView.builder(
        // 设置边距
        padding: const EdgeInsets.all(16.0),
        itemBuilder: (context, index) {
          // 如果index是基数
          if (index.isOdd) {
            // 定义一个分割线
            return new Divider();
          }

          // 向下取取整: 5/2=2.5 取2
          int newIndex = index ~/ 2;
          if (newIndex >= suggestions.length) {
            // 如果条目大于等于了数组的长度再放10条进行,这样就实现了滚动到底部自动加载更多
            suggestions.addAll(generateWordPairs().take(10));
          }
          // 这里使用的是新的索引不是原来的哦
          return buildItemView(suggestions[newIndex]);
        });
  }

  /*构建listview中的itemView*/
  Widget buildItemView(WordPair wordPair) {
    return new ListTile(
        title: new Text(wordPair.asLowerCase, style: fontStyle));
  }

  @override
  Widget build(BuildContext context) {
    // Scaffold移到这里了,App中的可是会跟着变化哦.
    return new Scaffold(
        appBar: AppBar(
          title: Text("列表展示"),
        ),
        body: buildListView());
  }
}

4. app代码

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: "Wlecome to flutter", home: new RomdomWordsWidget());
  }
}

5. 效果:

image.pngimage.png

相关文章

网友评论

    本文标题:flutter 学习笔记 第一篇

    本文链接:https://www.haomeiwen.com/subject/fjkmectx.html