flutter环境搭建与体验

Posted 倪伟金

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter环境搭建与体验相关的知识,希望对你有一定的参考价值。

flutter环境搭建与体验

早在2015年flutter就被提出来,Beta1版本于2018年2月27日在2018世界移动大会公布。它是谷歌的移动UI框架,可以快速在iosandroid上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。下面开始介绍flutter的环境搭建。

第一步(使用镜像)


由于在国内访问Flutter有时可能会受到限制,Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用户环境变量中:(如图)



第二步(获取flutter sdk)


获取步骤

1.去flutter官网下载其最新可用的安装包;
https://flutter.io/docs/development/tools/sdk/archive#windows
 注意,Flutter的渠道版本会不停变动,请以Flutter官网为准。另外,在中国大陆地区,要想正常获取安装包列表或下载安装包,可能需要翻墙,读者也可以去Flutter github项目下去下载安装包 。https://github.com/flutter/flutter/releases
2.将安装包zip解压到你想安装Flutter SDK的路径(如:C:\src\flutter;注意,不要将flutter安装到需要一些高权限的路径如C:\Program Files\)。
3.在Flutter安装目录的flutter文件下找到flutter_console.bat,双击运行并启动flutter命令行,接下来,你就可以在Flutter命令行运行flutter命令了。
(如flutter doctor,执行该命令会下载它自己的依赖项并自行编译。以后再运行就会快得多。)


flutter环境搭建与体验


第三步(安装Flutter Dart插件)


flutter是用dart语言写的,在IDE中需要添加Dart插件才能提供代码分析 (输入代码时进行验证、代码补全等).而Flutter插件则是支持Flutter开发工作流 (运行、调试、热重载等).这里使用的IDE是Android Studio。

步骤如下

1.启动Android Studio.
2.打开插件首选项 (Preferences>Plugins on macOS, File>Settings>Plugins on Windows & Linux).
3.选择 Browse repositories…, 选择 Flutter 插件并点击 install.
4.重启Android Studio后插件生效.


flutter环境搭建与体验


重启完IDE之后就可以新建flutter项目了,如图



flutter环境搭建与体验

参考官网自己摸索实现一个登陆页面

import 'package:flutter/material.dart';

void main(){runApp(new loginState());}
/***
 * login page base
 */

class loginState extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    var title = 'Web Images';
    return new MaterialApp(
      title: title,
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text(title),
        ),
        body: new loginView(),
      ),
    );
  }

}

TextEditingController schoolController = new TextEditingController();
TextEditingController userController   = new TextEditingController();
TextEditingController passController   = new TextEditingController();


/*****
 * login ui view
 */

class  loginView extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return new ListView(
      children: <Widget>[
        new Column(
          children: <Widget>[
            loginTopImg(),
            loginSchoolInput(),
            loginUserEditInput(),
            loginPassEditInput(),
            loginButton(context)
          ],
        )
      ],
    );
  }

}


/****
 * login page top img
 */

// ignore: missing_function_parameters
Widget loginTopImg()  {
  return new Padding(
    padding: EdgeInsets.all(40.0),
    child: new Image.asset(
      'images/icon_login_logo.png',
      scale: 1.3,
    ),
  );
}

/*****
 * login page school input
 * ***/

Widget loginSchoolInput(){
  return new Padding(
    padding: EdgeInsets.fromLTRB(20.00.0 ,20.00.0),
    child: new Stack(
      alignment: Alignment(1.01.0),
      children: <Widget>[
        new Row(
          children: <Widget>[
            new Padding(
              padding: EdgeInsets.all(5.0),
              child: new Image.asset(
                "images/icon_school.png",
                width: 40.0,
                height: 40.0,
                fit: BoxFit.fill,
              ),
            ),
            new Expanded(
                child: new TextField(
                  controller: schoolController,
                  decoration: new InputDecoration(
                      hintText: "请输入学校"
                  ),
                )
            )

          ],
        ),
        new IconButton(
          icon: new Icon(Icons.clear),
          onPressed: (){
            schoolController.clear();
          } ,
        )
      ],
    ),
  );
}

/******
 * login user edit input
 * ********/

Widget loginUserEditInput(){
  return new Padding(
    padding: EdgeInsets.fromLTRB(20.010.020.00.0),
    child: new Stack(
      alignment: Alignment(1.01.0),
      children: <Widget>[
        new Row(
          children: <Widget>[
            new Padding(
              padding: EdgeInsets.all(5.0),
              child: new Image.asset(
                "images/icon_username.png",
                width: 40.0,
                height: 40.0,
                fit: BoxFit.fill,
              ),
            ),
            new Expanded(
                child: new TextField(
                  controller: userController,
                  decoration: new InputDecoration(
                      hintText: "请输入用户名"
                  ),
                )
            ),
          ],
        ),
        new IconButton(icon: new Icon(Icons.clear), onPressed: (){
          userController.clear();
        })
      ],
    ) ,
  );
}

/******
 * login pass edit input
 * ********/

Widget loginPassEditInput(){
  return new Padding(
    padding: EdgeInsets.fromLTRB(20.010.020.00.0),
    child: new Stack(
      alignment: Alignment(1.01.0),
      children: <Widget>[
        new Row(
          children: <Widget>[
            new Padding(
              padding: EdgeInsets.all(5.0),
              child: new Image.asset(
                "images/icon_password.png",
                width: 40.0,height: 40.0,
                fit: BoxFit.fill,
              ),
            ),
            new Expanded(
                child: new TextField(
                  controller: passController,
                  decoration: new InputDecoration(
                      hintText: "请输入密码"
                  ),
                )
            ),
          ],
        ),
        new IconButton(icon: new Icon(Icons.clear), onPressed: (){
          passController.clear();
        })
      ],
    ),
  );
}

/************
 * login button
 * **********/

Widget loginButton(BuildContext context){
  return new Container(
    width: 300.0,
    padding: EdgeInsets.fromLTRB(30.0,15.0 , 30.00.0),
    child: new Card(
      elevation: 10.0// 正常情况下浮动的距离
      color: Colors.amber,
      child: new FlatButton(
        color: Colors.amber,
        child: new Padding(
          padding: EdgeInsets.all(8.0),
          child: new Text("登录",
            style: new TextStyle(
                color: Colors.white,
                fontSize: 16.0
            ),),
        ),
        onPressed: (){
          _checkSub(context);
        },
      ),
    ),
  );
}

/********
 * 登录提交校验
 */

void _checkSub(BuildContext context){
  String msgStr = "";
  if(!schoolController.text.isNotEmpty ){
    msgStr = "请先输入学校";
  }else  if(!userController.text.isNotEmpty){
    msgStr = "用户账号不能为空";
  }else  if(!passController.text.isNotEmpty){
    msgStr = "用户密码不能为空";
  }

  if(msgStr != ''){
    showDialog(
        context: context,
        builder: (context){
          return new AlertDialog(
            title: new Text("提示信息"),
            content: new Text(msgStr),
            actions: <Widget>[
              new FlatButton(child: new Text("确定"),onPressed: (){
                Navigator.of(context).pop();
              }),
            ],
          );
        }
    );
  }else{
    Navigator.of(context).push(
      new MaterialPageRoute(builder: (context){
        new loginState();
      }),
    );
  }
}

注意一点是本地图片的引用(需要在pubspec.yaml中声明)

flutter:
  uses-material-design: true
  assets:
     - images/icon_login_logo.png
     - images/icon_password.png
     - images/icon_school.png
     - images/icon_username.png

效果图


以上是关于flutter环境搭建与体验的主要内容,如果未能解决你的问题,请参考以下文章

Flutter之环境配置与项目搭建

1.Flutter开发工具准备与开发环境搭建

Flutter-01环境搭建

Flutter--实战在 macOS 上搭建 Flutter 开发环境

Tailwind.css 体验总结

Tailwind.css 体验总结