Flutterの道-Dart編

4849 ワード

Dartのいくつかの基礎知識はDart中国語ネットを見ることができて、ネット上にも多くの入門教程があります.このシリーズは私が学習過程で役に立つだけですが、いくつかの基礎チュートリアルでは言及されていません.
DartとJavaはいろいろな面で似ていますが、いろいろなところがあります.例えば、
  • は、Dartにpublic、private、protectedのようなキーワードがない.で、 最初は、この識別子はライブラリ内でプライベートな
  • である.
  • Dart 2では、newキーを使用せずに作成したり、使用したりすることができます.
  • Dartはすべてオブジェクトであり、メソッドもオブジェクトであり、タイプFunctionを有する.
  • Dartの変数の初期値はnullであり、intタイプでもnullである.
  • ..........

  • 関数#カンスウ#
    オプションのパラメータ
  • オプションのネーミングパラメータ呼び出しメソッドの場合、この形式を使用できます.  paramNamevalue  に表示されます.たとえば、
    enableFlags(bold: true, hidden: false);
    メソッドを定義するときに、  {param1param2, …}  の形式で命名パラメータを指定します:
    /// Sets the [bold] and [hidden] flags to the values
    /// you specify.
    enableFlags({bool bold, bool hidden}) {
      // ...
    }
    オプション命名パラメータはクラスの構造関数によく使用されます.参照クラス-構造関数オプション命名パラメータ
  • を参照してください.
  • オプションの位置パラメータいくつかの方法のパラメータを置く  []  では、オプションの位置パラメータになります.
    String say(String from, String msg, [String device]) {
      var result = '$from says $msg';
      if (device != null) {
        result = '$result with a $device';
      }
      return result;
    }
    は、オプションのパラメータを使用してメソッドを呼び出さない例です.
    assert(say('Bob', 'Howdy') == 'Bob says Howdy');
    は、オプションのパラメータを使用してメソッドを呼び出す例です.
    assert(say('Bob', 'Howdy', 'smoke signal') ==
        'Bob says Howdy with a smoke signal');
    は、オプションのパラメータを使用してメソッドを呼び出す例です. 

  • クラス#クラス#
    Dartではクラスの定義、継承、リロード、Javaの差は少なく、Javaができる場合はDartのオブジェクト向けも簡単です.しかし、いくつかの違いがあります.
    例えば、実列化の場合はnew Point()が一般的であり、Dartではnewはオプション、Javaは必須です.
     
    コンストラクタ
    一般的なコンストラクション関数の定義はJavaと同様で、クラス名と同じメソッドを定義するとコンストラクション関数が定義され、他のオプションの識別子を持つこともできます.
    class Point {
      num x;
      num y;
    
      Point(num x, num y) {
        // There's a better way to do this, stay tuned.
        this.x = x;
        this.y = y;
      }
    }

    コンストラクション関数パラメータをインスタンス変数に割り当てるシーンがあまりにも一般的であるため、Dartはこの操作を簡略化するために構文糖を提供します.
    class Point {
      num x;
      num y;
    
      // Syntactic sugar for setting x and y
      // before the constructor body runs.
      Point(this.x, this.y);
    }

     
    コンストラクション関数オプションネーミングパラメータ
    Flutterのいくつかのコントロールのソースコードを見ると、次のコードがよく見られます.
    const Text(this.data, {
        Key key,
        this.style,
        this.strutStyle,
        this.textAlign,
        this.textDirection,
        this.locale,
        this.softWrap,
        this.overflow,
        this.textScaleFactor,
        this.maxLines,
        this.semanticsLabel,
      }) : assert(data != null),
           textSpan = null,
           super(key: key);

    コンストラクション関数も関数なので、同様に関数のオプションの命名パラメータを適用し、Dartを加えると文法糖が提供されるので、以下のコードのように呼び出すことができます.
    new Text('  +     +25 ',
        style: TextStyle(
            color: const Color(0xffff0000),
        ),
    )

    初期化パラメータリスト
    コンストラクション関数体で実行するとインスタンスパラメータを初期化できます. 初期化式をカンマで区切ります.
    class Point {
      num x;
      num y;
    
      Point(this.x, this.y);
    
      // Initializer list sets instance variables before
      // the constructor body runs.
      Point.fromJson(Map jsonMap)
          : x = jsonMap['x'],
            y = jsonMap['y'] {
        print('In Point.fromJson(): ($x, $y)');
      }
    }

    警告: 初期化式の等号の右側の部分はアクセスできません  this .
    初期化リストはfinal変数の値を設定するのに適しています.
    リダイレクトコンストラクタ
    1つのコンストラクション関数がクラス内の他のコンストラクション関数を動かす場合があります.リダイレクトコンストラクタにはコードがありません.コンストラクタ宣言後、他のコンストラクタをコロンで呼び出します.
    class Point {
      num x;
      num y;
    
      // The main constructor for this class.
      Point(this.x, this.y);
    
      // Delegates to the main constructor.
      Point.alongXAxis(num x) : this(x, 0);
    }

    スーパークラスコンストラクタの呼び出し
    デフォルトでは、サブクラスのコンストラクション関数は、スーパークラスの無名のパラメータのないデフォルトコンストラクション関数を自動的に呼び出します.スーパークラスのコンストラクション関数は、サブクラスコンストラクション関数体が実行を開始する位置で呼び出されます.1つ提供された場合 initializer list(初期化パラメータリスト)では、初期化パラメータリストはスーパークラス構築関数の実行前に実行されます.
    スーパークラスにパラメータなしコンストラクション関数が無名である場合は、スーパークラスの他のコンストラクション関数を手動で呼び出す必要があります.スーパークラスコンストラクタは、コンストラクタパラメータの後にコロン(:)を使用して呼び出すことができます.
    class Person {
      String firstName;
    
      Person.fromJson(Map data) {
        print('in Person');
      }
    }
    
    class Employee extends Person {
      // Person does not have a default constructor;
      // you must call super.fromJson(data).
      Employee.fromJson(Map data) : super.fromJson(data) {
        print('in Employee');
      }
    }
    
    main() {
      var emp = new Employee.fromJson({});
    
      // Prints:
      // in Person
      // in Employee
      if (emp is Person) {
        // Type check
        emp.firstName = 'Bob';
      }
      (emp as Person).firstName = 'Bob';
    }

    次に、コンストラクション関数の実行順序を示します.
  • initializer list(初期化パラメータリスト)
  • superclass’s no-arg constructor(スーパークラスの無名構造関数)
  • main class’s no-arg constructor(プライマリクラスの無名構造関数)