第一个flutter应用

---

title: 第一个flutter应用

date: 2019-11-07 11:21:22

tags: flutter

---

1、第一个flutter应用根据官网api模仿了一个登录

![](http://image.gxx365.com/qw.jpeg)

<!-- more -->

## 先说一下写flutter 和写h5的体会吧

1、flutter在配置上就是比较麻烦需要配置安卓模拟器和ios模拟器和一些sdk,相对于H5来说H5只需要一个node环境和一个浏览器就能愉快的开发了

2、flutter是用datr语言写是面向对象的语法的,相对于写js的前端同学来说是有一些困难的 里面有一些`泛型` `class` 语法(写过`typescript`的就上手比较容易了)

3、这个小的登录主要包含了flutter的跳转路由传参数、请求http接口判断账号密码、获取Input文本接口传参

## 开始贴代码

1.引入项目依赖文件

```javascript

import 'dart:convert' as convert;

import 'package:flutter/material.dart';

import './http.dart';

```

2.这是我的依赖文件直接复制进去会自动下载包,注意代码缩进和冒号后的空格dart不加空格就会报错项目规范很严谨(经常写js的可能不太习惯😂😂)

```dart

    dependencies:

        flutter:

            sdk: flutter

        dio: ^1.0.14

        json_annotation: ^2.0.0

        # The following adds the Cupertino Icons font to your application.

        # Use with the CupertinoIcons class for iOS style icons.

        cupertino_icons: ^0.1.2

        english_words: ^3.1.0

        http: ^0.11.3+16

    dev_dependencies:

        flutter_test:

            sdk: flutter

        build_runner: ^1.1.3

        json_serializable: ^2.0.1

```

3.这里就是一个根组件 相当于 (react框架的ReactDOM.render挂载到dom)

```dart

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

    class MyApp extends StatelessWidget {

    @override

    Widget build(BuildContext context) {

        return MaterialApp(

        title: '登录',

        theme: ThemeData(primaryColor: Colors.white), //主题

        home: Scaffold(

            appBar: AppBar(

            leading: BackButton(color: Colors.grey), //左边返回Icon

            title: Text('登录'),

            ),

            body: Input(),

        ),

        );

    }

    }

```

4.生成的Input组件放到MyApp中的

```dart

  class Input extends StatefulWidget {

    @override

    _InputState createState() => _InputState();

}

```

5._InputState组件挂载到上面Input里面(因为这个博客是flutter写完之后才编写的所有这些主要代码都放到这里了,但是重要的地方在组件中都有注释)

```dart

class _InputState extends State<Input> {

  final TextEditingController _user = new TextEditingController(); //相当于创建一个控制器接收user的值

  final TextEditingController _pwd = new TextEditingController();

  @override

  Widget build(BuildContext context) {

    return Container( //容器组件里面可以使用Padding,Margin等函数

      margin: const EdgeInsets.fromLTRB(0, 20.0, 0, 0),//参数值对应的四个方向 左、上、右、下

      child: Column( //flutter的布局方式 Column是上下排列 Row在一行排列

        children: <Widget>[

          Container(

            child: Row(children: [

              Container(

                padding: const EdgeInsets.fromLTRB(8.0, 4.0, 0, 0),

                child: Text(

                  '用户名:',

                  style: new TextStyle(color: Colors.black, fontSize: 18),

                ),

              ),

              Container(

                  width: 300,

                  child: Theme(

                    //设置主题 边框线等等。。。

                    data: new ThemeData(primaryColor: Colors.green),

                    child: TextField( //设置文本 输入框

                      controller: _user, //控制器挂载到controller

                      keyboardType: TextInputType.text, //键盘类型

                      cursorColor: Colors.grey, //光标颜色

                      decoration: InputDecoration(hintText: '请输入用户名'),

                    ),

                  )),

            ]),

          ),

          Container(

            child: Row(children: [

              Container(

                padding: const EdgeInsets.fromLTRB(26, 4.0, 0, 0),

                child: Text(

                  '密码:',

                  style: new TextStyle(color: Colors.black, fontSize: 18),

                ),

              ),

              Container(

                  width: 300,

                  child: Theme(

                    data: new ThemeData(primaryColor: Colors.green),

                    child: TextField(

                      controller: _pwd,

                      cursorColor: Colors.grey,

                      keyboardType: TextInputType.text, //键盘类型

                      textInputAction: TextInputAction.done,

                      obscureText: true, //控制文本是否以加密形式展示

                      decoration: InputDecoration(hintText: '请输入密码'),

                    ),

                  )),

            ]),

          ),

          Container(

            width: 200,

            margin: const EdgeInsets.fromLTRB(0.0, 20.0, 0, 0),

            child: RaisedButton( //按钮组件

              onPressed: () {

                  //点击按钮的执行事件

                Map<String, String> map = new Map(); //创建一个类型数据给接口传参

                var pwd = _pwd.text;

                var user = _user.text;

                map["user"] = user;

                map["pwd"] = pwd;

                var obj = convert.jsonEncode(map);//参数转化相当于JSON.stringfy

                //接口请求 这个封装在别的组件 下面会有

                HttpController.post("http://localhost:8002/login", (data) {

                  if (data != null) {

                    var res = convert.jsonDecode(data); //解码

                    var code = res['code'];

                    if (code == 1) {

                    //跳转路由

                      Navigator.push(context,

                          MaterialPageRoute(builder: (context) => MyHome()));

                    }

                  }

                }, params: obj);

              },

              child: Text('登录'),

              textColor: Colors.white,

              color: Colors.blue,

              shape: RoundedRectangleBorder(

                  borderRadius: BorderRadius.circular(4.0)),

            ),

          )

        ],

      ),

    );

  }

}

```

6.跳转的首页组件

```dart

class MyHome extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return Scaffold(

        appBar: AppBar(

          leading: BackButton(color: Colors.grey),

          title: Text('首页'),

        ),

        body: Center(

          child: RaisedButton(

            child: RaisedButton(

              child: Text('返回登录页面'),

              onPressed: () {

                Navigator.pop(context);//返回上一页

              },

            ),

          ),

        ));

      }

    }

```

7.请求http组件

```dart

import 'package:http/http.dart' as http;

class HttpController {

  static void get(String url, Function callback,

      {Map<String, String> params, Function errorCallback}) async {

    if (params != null && params.isNotEmpty) {

      StringBuffer sb = new StringBuffer("?");

      params.forEach((key, value) {

        sb.write("$key" + "=" + "$value" + "&");

      });

      String paramStr = sb.toString();

      paramStr = paramStr.substring(0, paramStr.length - 1);

      url += paramStr;

    }

    try {

      http.Response res = await http.get(url);

      if (callback != null) {

        callback(res.body);

      }

    } catch (exception) {

      if (errorCallback != null) {

        errorCallback(exception);

      }

    }

  }

  static void post(String url, Function callback,

      {params, Function errorCallback}) async {

    try {   

        //记得content-type和后台服务统一                                         

      http.Response res = await http.post(url,headers: {"content-type": "application/json"}, body: params);

      if (callback != null) {

        callback(res.body);

      }

    } catch (e) {

      if (errorCallback != null) {

        errorCallback(e);

      }

    }

  }

}

```

### 最后总结一下

1、刚开始上手flutter感觉挺蒙但是写下来之后其实还是一些函数的调用里面的大多数功能都会封装在函数里面调用传参执行的

2、样式上写起来比较乱没有h5写起来整洁但是相对于ios和安卓开发还是有很多优点的,上手程度来说也容易一点而且比较重要的是`跨平台`一套代码两端使用

3、而且flutter是谷歌维护的 相信以后会越来越完美的

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容