Dart flutter 勉強
一旦Dartのコーディングルール的なのを確認
命名規則
Dartでは3種類
- UpperCamel
- 単語の1文字目を大文字にする
- lowerCamel
- 最初の単語の1文字目は小文字、後の単語の1文字目は大文字
- lowercase_with_underscores
- 単語と単語の間を
_(アンダースコア)
で区切る
- 単語と単語の間を
UpperCamelCase
単語の1文字目を大文字にする。
使用するのは以下のもの
- Class
- enum
- type(型)
- typedef
- type parameters(ジェネリクス等)
- extensions
lowercase_with_underscores
いわゆるスネークケース
単語と単語の間を_(アンダースコア)
で繋ぐもの
使用するのは以下のもの
- file names(ファイル名、ソース名)
- package names (パッケージ名)
- directory names(ディレクトリ名)
- package prefix
lowerCamelCase
- クラスのメンバ
- top-level definitions (いまいち何のこっちゃ)
- 変数
- パラメータ
- (推奨)定数名
定数名を全部大文字にする(EXAMPLE_CONST_VALUE)みたいなのは基本非推奨
2文字以上の頭字語や、略語は大文字にする
+ HttpSftp
+ HttpsFtp
- HTTPSFTP
ただし、2文字の頭字語は2文字とも大文字にする
+ IO ( input/ output)
- Io
2文字の略語の場合は通常の変数同様、頭文字のみ大文字
+ Id ( identification )
- ID
単語の意味が変わったら大文字にしていいっぽそう
推奨
コールバックのパラメータのうち未使用のパラメータは_
や__
で受け取る
プライベート識別子として_
が使われる
プライベートではないクラスやメソッドに対して_
は使わない
型やスコープの情報を変数名の頭に付けない
+ String message
- String sMessage
- packageインポート
- exportとimportが分離されている
- アルファベット順(昇順)
フォーマットは
dart format
1行は80文字を超えないように適度に改行
中かっこの省略はできない
(Flutterは知らん)
APIアクセス
HTTPパッケージの追加
flutter pub add http
HttpClient
というパッケージもあるが、http
パッケージに比べLow-Levelとされている
チュートリアルはhttpで十分
Future型でメソッド定義
asyncも忘れずに
Future<Map> sendData(String msg) async {
// ...
}
httpクラスでpost
var response = await http.post(
Uri.parse('https://api.openai.com/v1/chat/completions'),
headers: {
'Authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAAA'
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode({
"model": "gpt-3.5-turbo-0613",
"max_tokens": 256,
"messages": [
{
"role": "system",
"content":
"Please make all responses in sentences of up to 256 tokens."
},
{"role": "user", "content": msg},
]
}),
);
この時、header
はMap<String, String>
で受け付けているがbody
はEncode
されたものしか受け付けてないっぽいので今回は'dart:convert'
を使ってJSONにエンコードする
POST先はChatGPT
256トークンを超えて文章を生成しないようにも指示しておく
受け取り後のreturn
return jsonDecode(utf8.decode(response.bodyBytes));
httpの受け取りデータだけ文字化けしていたため、bodyバイトコードをutf-8でエンコード
さらにjsonDecodeでMap型に変換し、return
レスポンスにUTF-8が指定されていれば必要ないのかもしれない
現状ではレスポンスのContent-Type
にUTF-8は指定されていなかった
呼び出し側
sendChatMessage(current).then((response) {
// 成功時の処理
String msg = response['choices'][0]['message']['content'];
})
.catchError( (onError) {
// エラー時の処理
appState.addHistory(ChatData(ChatMessageType.received, onError.toString()));
})
.whenComplete( () {
// 成功・エラーに関わらず実行
});
テスト
iOSはCocoaPodsが必要らしい
なければインストール
testのファイル名は~~_test.dart
という名前にする必要がある
統合テストのパッケージとしてintegration_test
が必要
flutter_driver
は古いらしく移行手順があった
API通信したレスポンスをキャッシュとしてJSONオブジェクトのまま保持したい
パッケージ
-
- メモリにキャッシュ
- NoSQLである
-
- SQLite パッケージ
-
- 単純なKeyValue式っぽい?
公式紹介では
- SQL
- ファイル書き込み
- shared_preference(KeyValue)
が紹介されてた
Hiveを試す
Hiveの後継?
どっちもファイルにして保存していることに変わりはない・・・?