利用Flutter寫(xiě)一個(gè)跨平臺(tái)的果核APP(4)——數(shù)據(jù)存儲(chǔ)

前言

目前我們已經(jīng)實(shí)現(xiàn)了幾個(gè)界面,今天這篇文章開(kāi)始著手進(jìn)行登錄頁(yè)的制作,主要流程就是獲取輸入框中的內(nèi)容,發(fā)送給后臺(tái)進(jìn)行驗(yàn)證岖妄,如果成功將返回信息保存在本地并跳轉(zhuǎn)至首頁(yè),如果失敗就提示用戶(hù)重新輸入寂祥。
在這里面需要掌握3塊知識(shí)荐虐,第一是flutter中的表單組件的使用,然后則是flutter中的數(shù)據(jù)存儲(chǔ)丸凭,最后是網(wǎng)絡(luò)請(qǐng)求福扬。

效果

代碼

上述三個(gè)部分我已經(jīng)在其他文章中分別介紹了,詳情點(diǎn)擊相關(guān)文章的鏈接

  1. 《flutter表單組件》
  2. 《Flutter數(shù)據(jù)存儲(chǔ)之shared_preferences》
  3. 《利用Flutter寫(xiě)一個(gè)跨平臺(tái)的果核APP(3)——網(wǎng)絡(luò)請(qǐng)求》

剩下的我就直接放出首頁(yè)代碼了:

import 'package:flutter/material.dart';
import 'package:flutter_guohe/constant//UrlConstant.dart';
import 'package:dio/dio.dart';
import 'package:flutter_guohe/views/customview.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_guohe/constant/SpConstant.dart';
import 'package:flutter_guohe/pages/app.dart';

class LoginPage extends StatefulWidget {
  static String tag = 'login-page';

  @override
  _LoginPageState createState() => new _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  GlobalKey<FormState> _formKey = new GlobalKey<FormState>();

  String _account;

  String _password;

  //表單驗(yàn)證方法
  void _forSubmitted(BuildContext context) {
    var _form = _formKey.currentState;

    if (_form.validate()) {
      _form.save();
      login(context, _account.trim(), _password.trim());
    }
  }

  //登錄
  void login(BuildContext context, String account, String password) {
    showDialog(
        context: context,
        builder: (context) {
          return new LoadingDialog(content: "登錄中惜犀,請(qǐng)稍后......");
        });
    FormData formData =
        new FormData.from({"username": account, "password": password});
    Dio().post(Constant.STU_INFO, data: formData).then((res) {
      print(account + " " + password);
      if (res.statusCode == 200) {
        Navigator.pop(context);
        if (res.data['code'] == 200) {
          print(res.data);
          String name = res.data['info']['name'];
          String academy = res.data['info']['academy'];
          String major = res.data['info']['major'];
          String stu_id = res.data['info']['name'];
          String stu_pass = res.data['info']['password'];
          List<String> list = new List();
          list.add(name);
          list.add(academy);
          list.add(major);
          list.add(stu_id);
          list.add(stu_pass);
          store(list);
          Navigator.push(
            context,
            new MaterialPageRoute(builder: (context) => new Guohe()),
          );
        }
      }
    });
  }

  //將學(xué)生的相關(guān)信息保存至本地
  void store(List<String> list) async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    sharedPreferences.setBool(SpConstant.IS_LOGIN, true);
    sharedPreferences.setStringList(SpConstant.STU_INFO, list);
  }

  @override
  Widget build(BuildContext context) {
    final account = new TextFormField(
      autofocus: true,
      initialValue: '',
      decoration: new InputDecoration(
        labelText: '學(xué)號(hào)',
      ),
      onSaved: (val) {
        _account = val;
      },
    );

    final password = new TextFormField(
      initialValue: '',
      obscureText: true,
      decoration: new InputDecoration(
        labelText: '密碼',
      ),
      onSaved: (val) {
        _password = val;
      },
    );

    final loginButton = new FloatingActionButton(
      backgroundColor: Colors.white,
      foregroundColor: Colors.black26,
      child: const Icon(Icons.arrow_forward),
      elevation: 18.0,
      onPressed: () => _forSubmitted(context),
    );

    final loginBox = new Container(
      width: 320.0,
      height: 250.0,
      margin: new EdgeInsets.only(top: 300.0, right: 30.0),
      child: new Stack(
        children: <Widget>[
          new Container(
              color: Colors.white,
              width: 280.0,
              height: 220.0,
              child: new Form(
                key: _formKey,
                child: new ListView(
                  shrinkWrap: true,
                  padding: new EdgeInsets.only(left: 24.0, right: 24.0),
                  children: <Widget>[
                    SizedBox(height: 48.0),
                    account,
                    new SizedBox(
                      height: 15.0,
                    ),
                    password,
                  ],
                ),
              )),
          new Positioned(
              //方法二
              right: 15.0,
              top: 180.0,
              child: loginButton),
        ],
      ),
    );

    return new Scaffold(
      backgroundColor: Colors.white,
      body: new Container(
        decoration: new BoxDecoration(
            image: new DecorationImage(
                image: new AssetImage('assets/imgs/bg_login.webp'),
                fit: BoxFit.cover)),
        child: new Center(child: loginBox),
      ),
    );
  }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铛碑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虽界,更是在濱河造成了極大的恐慌汽烦,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莉御,死亡現(xiàn)場(chǎng)離奇詭異撇吞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)礁叔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)牍颈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人琅关,你說(shuō)我怎么就攤上這事煮岁。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵画机,是天一觀(guān)的道長(zhǎng)勤篮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)色罚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任账劲,我火速辦了婚禮戳护,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瀑焦。我一直安慰自己腌且,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布榛瓮。 她就那樣靜靜地躺著铺董,像睡著了一般。 火紅的嫁衣襯著肌膚如雪禀晓。 梳的紋絲不亂的頭發(fā)上精续,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音粹懒,去河邊找鬼重付。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凫乖,可吹牛的內(nèi)容都是我干的确垫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼帽芽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼删掀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起导街,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤披泪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后搬瑰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體付呕,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年跌捆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了徽职。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佩厚,死狀恐怖姆钉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤潮瓶,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布陶冷,位于F島的核電站,受9級(jí)特大地震影響毯辅,放射性物質(zhì)發(fā)生泄漏埂伦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一思恐、第九天 我趴在偏房一處隱蔽的房頂上張望沾谜。 院中可真熱鬧,春花似錦胀莹、人聲如沸基跑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)媳否。三九已至,卻和暖如春荆秦,著一層夾襖步出監(jiān)牢的瞬間篱竭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工步绸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留室抽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓靡努,卻偏偏與公主長(zhǎng)得像坪圾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惑朦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,180評(píng)論 25 707
  • 用兩張圖告訴你兽泄,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,732評(píng)論 2 59
  • 1漾月、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,982評(píng)論 3 119
  • 半生寂苦空蹉跎病梢,人生幾何?對(duì)酒當(dāng)歌梁肿,閑看秋枝勾殘?jiān)隆?那時(shí)少年荒唐事蜓陌,情思難測(cè)。好天良夜吩蔑,不執(zhí)金戈采青荷钮热。
    狄克先生閱讀 797評(píng)論 1 8
  • 1.你可以使用我們定制的 cnpm (gzip 壓縮支持) 命令行工具代替默認(rèn)的 npm: 2.或者你直接通過(guò)添加...
    darebeat閱讀 1,840評(píng)論 0 0