Dart言語学習ノート1

10838 ワード

変数宣言1 varはJavaScriptのvarに似ています.どのタイプの変数も受信できますが、最大の違いは、Dartのvar変数が一度与えられたら、タイプが決定されます.
	var t;
	t="hi world";
	//      dart    ,    t        String,
	//                 。
	t=1000;
上のコードはJavaScriptで問題ありません.フロントエンドの開発者は注意してください.なぜこの違いがあるかというと、Dart自体は強いタイプの言語であり、どの変数も確定タイプがあります.コンパイルが完了するとそのタイプはすでに確定されていますが、JavaScriptは純粋に弱いタイプのスクリプト言語であり、varは変数の声明方式だけです.
2 dynamicとObject DynamicとObjectはvar機能と似ています.いずれも賦課時に自動的にタイプ推定を行います.違いは、賦課後にそのタイプを変えることができます.
	dynamic t;
	t="hi world";
	//        
	t=1000;
Objectはすべての対象の基本類で、つまりすべてのタイプはObjectのサブクラスですので、どのタイプのデータでもObject声明の対象に値が付けられます.だから、表現効果はdynamicと似ています.
3 finalとconstは、変数を変更するつもりがないなら、finalまたはconstを使用しても、varではなく、タイプでもありません.一つのfinal変数は一回だけ設定されます.二つの違いは、const変数はコンパイル時定数で、final変数は最初の使用時に初期化されます.finalまたはconstによって修飾された変数は、変数タイプを省略することができます.
	//    String      
	final str = "hi world";
	//final str = "hi world"; 
	const str1 = "hi world";
	//const String str1 = "hi world";

関数Dartは本当に対象に向かっている言語ですので、関数でも対象として、Functionのタイプがあります.これは関数が変数に値を与えたり、パラメータとして他の関数に渡すことができることを意味します.これは関数プログラミングの典型的な特徴です.
1関数宣言
	bool isNoble(int atomicNumber) {
   		 return _nobleGases[atomicNumber] != null;
  	}
ダント関数は、戻り値の種類が表示されていない場合は、デフォルトでdynamicとして処理します.ただし、関数の戻り値にはタイプがありません.
 	typedef bool CALLBACK();

   	//       ,     dynamic,  bool
   	isNoble(int atomicNumber) {
   	  return _nobleGases[atomicNumber] != null;
   	}
   	
   	void test(CALLBACK cb){
   	   print(cb()); 
   	}
   	//  ,isNoble  bool  
   	test(isNoble);
2表式だけを含む関数については、簡略文法を使用することができます.
	bool isNoble (int atomicNumber )=> _nobleGases [ atomicNumber ] != null ;
3関数を変数として使う
	var say= (str){
	  print(str);
	};
	say("hi world");
4関数をパラメータとして伝える
	void execute(var callback){
	    callback();
	}
	execute(()=>print("xxx"))
5オプションの位置パラメータ
関数パラメータのセットを包装し、オプションの位置パラメータとして[]でマークします.
	String say(String from, String msg, [String device]) {
	  	var result = '$from says $msg';
	 if (device != null) {
	    result = '$result with a $device';
	  }
	  	return result;
}
以下はオプションのパラメータなしにこの関数を呼び出す例です.
	say('Bob', 'Howdy'); //   : Bob says Howdy
以下は三つ目のパラメータでこの関数を呼び出す例です.
	say('Bob', 'Howdy', 'smoke signal'); //   :Bob says Howdy with a smoke signal
6オプションのネーミングパラメータ定義関数は、ネーミングパラメータを指定するために{param 1,param 2,...}を使用します.たとえば:
	//  [bold] [hidden]  
	void enableFlags({bool bold, bool hidden}) {
	    // ... 
	}
関数の呼び出しには、指定された名前パラメータが使用できます.例えば:paramName:value
	enableFlags(bold: true, hidden: false);
オプションのネーミングパラメータはFutterに多く使われています.

非同期サポートDartクラスにはFutureまたはStreamオブジェクトに戻る関数が非常に多くあります.これらの関数は非同期関数と呼ばれています.IO動作のように、時間のかかる動作を設定した後に戻ります.この操作が完了するまで待つのではありません.
asyncとawaitのキーワードは非同期プログラムをサポートしています.同期コードとよく似た非同期コードを書いてください.

Future FutureはJavaScriptのPromiseと非常に似ています.非同期動作の最終的な完了(または失敗)とその結果の値の表現を表します.簡単に言えば、非同期動作を処理するために用いられ、非同期処理が成功したら成功した操作を実行し、非同期処理が失敗したらエラーを捕獲したり、後続の動作を停止したりする.一つのFutureは一つの結果にしか対応できません.成功するか、失敗するかです.
自分の機能が多いので、ここではよく使うAPIと特性だけを紹介します.また、FutureのすべてのAPIの戻り値はまだFutureオブジェクトであることを覚えてください.チェーンコールを簡単に行うことができます.

Future.thenは、一例を簡単にするために、Future.delayedを使用して、遅延タスクを作成しました.すなわち、2秒後に結果文字列「hi world!」に戻ります.そして、thenで非同期の結果を受信して、コードは次の通りです.
	Future.delayed(new Duration(seconds: 2),(){
	   return "hi world!";
	}).then((data){
	   print(data);
	});	

Future.catchErrerがもし非同期タスクにエラーが発生したら、catchErrでエラーを捕獲できます.上記の例を以下のように変更します.
	Future.delayed(new Duration(seconds: 2),(){
	   //return "hi world!";
	   throw AssertionError("Error");  
	}).then((data){
	   //           
	   print("success");
	}).catchError((e){
	   //           
	   print(e);
	});
この例では、例外的なタスクにおいて、thenのコールバック関数は実行されなくなり、代わりに、catcherrコールバック関数が呼び出されます.しかし、catch Errだけがエラーをキャプチャすることができるわけではありません.then方法にはオプションのパラメータがあります.異常をキャプチャすることもできます.
	Future.delayed(new Duration(seconds: 2), () {
	    //return "hi world!";
	    throw AssertionError("Error");
	}).then((data) {
	    print("success");
	}, onError: (e) {
	    print(e);
	});

Future.when Completteは、非同期タスクの実行成功や失敗に関係なく、いくつかのことをするシーンがあります.例えば、ネットワーク要求の前にロードダイアログを開き、要求の終了後にダイアログを閉じます.このような場面には二つの方法があります.一つ目はそれぞれthenまたはcatchでダイアログを閉じます.二つ目はFutreのwhenCompletteeを使ってフィードバックします.上記の例を改めます.
	Future.delayed(new Duration(seconds: 2),(){
	   //return "hi world!";
	   throw AssertionError("Error");
	}).then((data){
	   //          
	   print(data);
	}).catchError((e){
	   //            
	   print(e);
	}).whenComplete((){
	   //             
	});

Future.waitは、いくつかの非同期的なタスクが実行されるのを待つ必要があります.例えば、インターフェイスがあります.まず、二つのネットワークインターフェースからデータを取得し、成功したら、二つのインターフェースデータを特定の処理してからUIインターフェースに表示するにはどうすればいいですか?答えはFuture.waitです.Future配列のパラメータを受け入れて、配列の中のすべてのFutureが実行に成功した後に、thenの成功フィードバックをトリガします.Futureが実行に失敗したら、エラーフィードバックをトリガします.以下では、Future.delayedをシミュレートして、二つのデータから取得した非同期タスクをシミュレートし、二つの非同期タスクが成功したら、二つの非同期タスクの結果をつなぎ合わせて印刷します.コードは以下の通りです.
	Future.wait([
	  // 2        
	  Future.delayed(new Duration(seconds: 2), () {
	    return "hello";
	  }),
	  // 4        
	  Future.delayed(new Duration(seconds: 4), () {
	    return " world";
	  })
	]).then((results){
	  print(results[0]+results[1]);
	}).catchError((e){
	  print(e);
	});
上のコードを実行すると、4秒後にコンソールで「ハローワールド」が表示されます.

Async/await Dartのasync/awaitとJavaScriptの中のasync/awaitは機能と使い方は同じです.JavaScriptの中のasync/awaitの使い方を知っていれば、直接にこの節を飛び越えることができます.

(Callback hell)

, , Future.then 。 , , Id, Id, , , , , :
	//           
	Future login(String userName, String pwd){
	    ...
	    //    
	};
	Future getUserInfo(String id){
	    ...
	    //       
	};
	Future saveUserInfo(String userInfo){
	    ...
	    //        
	};

, :

	login("alice","******").then((id){
	 //       ,id          
	 getUserInfo(id).then((userInfo){
	    //          
	    saveUserInfo(userInfo).then((){
	       //      ,         
	        ...
	    });
	  });
	})

, , , , , (Callback hell)。 JavaScript , JavaScript , ECMAScript6 ECMAScript7 , , ECMAScript6 Promise, ECMAScript7 async/await。 Dart JavaScript :Future Promise, async/await 。 Future async/await 。

Future callback hell

	login("alice","******").then((id){
	      return getUserInfo(id);
	}).then((userInfo){
	    return saveUserInfo(userInfo);
	}).then((e){
	   //         
	}).catchError((e){
	  //      
	  print(e);
	});

, “Future API Future , ” , then Future , future , then , , 。

async/await callback hell

Future Future , , ? , async/await , , , :
	task() async {
	   try{
	    String id = await login("alice","******");
	    String userInfo = await getUserInfo(id);
	    await saveUserInfo(userInfo);
	    //           
	   } catch(e){
	    //       
	    print(e);   
	   }  
	}

async , Future , then 。
await Future, , ;await async 。

, async/await 。

	  ,    JavaScript  Dart ,async/await        ,                  	Promise(Future)    。

Stream

Stream , Future , ( )。 , , 。 Stream , 、 。 :
	Stream.fromFutures([
	  // 1      
	  Future.delayed(new Duration(seconds: 1), () {
	    return "hello 1";
	  }),
	  //       
	  Future.delayed(new Duration(seconds: 2),(){
	    throw AssertionError("Error");
	  }),
	  // 3      
	  Future.delayed(new Duration(seconds: 3), () {
	    return "hello 3";
	  })
	]).listen((data){
	   print(data);
	}, onError: (e){
	   print(e.message);
	},onDone: (){
	
	});

	I/flutter (17666): hello 1
	I/flutter (17666): Error
	I/flutter (17666): hello 3

, 。

    :  Stream        ,     Stream               ?

Dart Java JavaScript , , , Dart Java JavaScript。

Dart vs Java

,Dart Java ; VM ,Dart VM , , , , Dart ,VM , Google go( vm GC)、javascript(v8)、dalvik(android java vm) 。 Dart Flutter GC 10ms , Dart Java , 。 ,Dart java , Dart Java( lamda ), Dart , , Flutter , Dart , Dart , 。

Dart vs JavaScript

JavaScript , TypeScript、Coffeescript Facebook flow( JavaScript , ) 。 ( Python、PHP),JavaScript , JavaScript , , JavaScript , 。 , ,JavaScript , , JavaScript , , 。 , , 。 , Flutter ,Dart , 、 。 Dart 2.0 (Strong Mode), (checked mode) (optional type) , ,Dart TypeScript、Coffeescript , ,Dart , ,dart 、APP 、web , !

, Dart , , , , , , , , 。