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の後継?

どっちもファイルにして保存していることに変わりはない・・・?