鍍金池/ 教程/ Java/ 步驟 4:創(chuàng)建一個 PirateName 的類
步驟 1:運行一個框架應(yīng)用
下面要做什么?
總結(jié)和資源
步驟 0:環(huán)境搭建
步驟 5:保存到本地存儲
步驟 7:構(gòu)建并運行 App
步驟 2:添加一個輸入框
步驟 6:從 JSON 編碼的文件里讀取名字
步驟 4:創(chuàng)建一個 PirateName 的類
步驟 3:添加一個按鈕

步驟 4:創(chuàng)建一個 PirateName 的類

在這一步中,你改變的僅是 Dart 的代碼,你可以自己為你新建的類起個名字,當(dāng)創(chuàng)建這個類的一個實例,隨機選擇一個名字和稱謂,或者你可以提供一個名字和稱謂給構(gòu)造函數(shù)。

編輯 piratebadge.dart

在文件的頂部加入 import

import 'dart:html';

import 'dart:math' show Random;
piratebadge.dart

關(guān)鍵信息

  • 使用 show 關(guān)鍵字,你可以只導(dǎo)入你需要的類,方法,和屬性。
  • Random 提供了一個隨機數(shù)的發(fā)生器。

加入一個類的聲明在在文件的底部

...
class PirateName {
}
  • 這個類的聲明給類提供一個名字

創(chuàng)建一個類級別的 Random 實體

class PirateName {
  static final Random indexGen = new Random();
}
  • static 定義類級別的字段,就是說隨機數(shù)發(fā)生器被所有的類實例共享。
  • Dart 編輯器強調(diào)靜態(tài)名字。
  • 使用 new 調(diào)用一個構(gòu)造函數(shù)。

在類中加入兩個成員變量,一個定義 first name ,一個定義 appellation 。

class PirateName {
  static final Random indexGen = new Random();
  String _firstName;
  String _appellation;
}
  • 私有變量用(_).強調(diào)。Dart 沒有 private 關(guān)鍵字。

在類內(nèi)創(chuàng)建兩個靜態(tài)的 List ,提供 namesappellations 兩個集合供選擇。

class PirateName {
  ...
  static final List names = [
    'Anne', 'Mary', 'Jack', 'Morgan', 'Roger',
    'Bill', 'Ragnar', 'Ed', 'John', 'Jane' ];
  static final List appellations = [
    'Jackal', 'King', 'Red', 'Stalwart', 'Axe',
    'Young', 'Brave', 'Eager', 'Wily', 'Zesty'];
}
  • final 修飾的變量不能更改。
  • 列表是 Dart 內(nèi)置的,使用 List 來創(chuàng)建。
  • List 類提供 API 給列表。

    給類提供一個構(gòu)造函數(shù)。

 class PirateName {
  ...
  PirateName({String firstName, String appellation}) {
    if (firstName == null) {
      _firstName = names[indexGen.nextInt(names.length)];
    } else {
      _firstName = firstName;
    }
    if (appellation == null) {
      _appellation = appellations[indexGen.nextInt(appellations.length)];
    } else {
      _appellation = appellation;
    }
  }
}
  • 構(gòu)造函數(shù)名和類名相同。
  • 參數(shù)被包含在花括號 ({ }) 是可選的被命名的參數(shù)。
  • nextInt() 函數(shù)得到一個隨機整數(shù)從隨機數(shù)發(fā)生器里。
  • 使用方括號 ([ ]) 為列表添加索引。
  • 使用 length 屬性返回列表中元素的個數(shù)。
  • 代碼使用隨機數(shù)作為列表的索引。

提供一個 getter 給私有字段。

class PirateName {
  ...
  String get pirateName =>
    _firstName.isEmpty ? '' : '$_firstName the $_appellation';
}
  • Getters 是一個特別的方法,提供訪問對象的屬性。
  • 三元運算符 ?:if-then-else 語句的簡略寫法。
  • 字符串插入 ('$_firstName the $_appellation') 讓我們很容易從其他對象構(gòu)建字符串。
  • 大箭頭 ( => expr; ){ return expr; } 語法的一個簡稱。

重寫 toString() 方法。

class PirateName {
  ...
  String toString() => pirateName;
}
  • 因為對象實現(xiàn) toString() 方法沒有給很多的信息,很多類重寫 toString() 。
  • 當(dāng)你調(diào)用 print(anObject) 得到字符串,返回值是 anObject.toString() 得到的。
  • 重寫 toString() 在的調(diào)試和輸出的時候特別有用。

修改 setBadgeName() 方法,使用 PirateName 而不是 String

void setBadgeName(PirateName newName) {
  querySelector('#badgeName').text = newName.pirateName;
}
  • 代碼調(diào)用 getter 得到 PirateName 作為一個字符串。

更改 updateBadge() 基于輸入字段的值生成 PirateName

void updateBadge(Event e) {
  String inputName = (e.target as InputElement).value;

  setBadgeName(new PirateName(firstName: inputName));
  ...
}
  • 調(diào)用構(gòu)造函數(shù)給可選的命名參數(shù)提供一個值。

更改 generateBadge() 生成一個 PirateName 而不是使用 Anne Bonney。

void generateBadge(Event e) {
  setBadgeName(new PirateName());
}
  • 在這種情況下,通過無參數(shù)調(diào)用構(gòu)造函數(shù)。

運行應(yīng)用

使用 File > Save All 保存。

運行應(yīng)用正確點擊 piratebadge.html 并選擇 Run in Dartium 。

把你的應(yīng)用和下面的比較。

在輸入框中輸入。刪除輸入字段。點擊按鈕。

http://wiki.jikexueyuan.com/project/learn-dart-in-minutes/images/dart1-learn-dart-in-minutes-step-4-run-the-skeleton-app-pic1.png" alt="dart4" />