RealtimeDBのトランザクション処理にトライ – 開発日記(81)

2024/03/15~2024/03/16

各種挙動調整・不具合修正を実施

  • ideaCount描画問題の対応画面のスクロールやブラウザのウィンドウサイズ変更などの場合に、場所がずれることがあった)
  • リレーションをマウスドラッグで行う処理の調整、など

FlutterのHot Restart(Hot Reload)問題

ある時からflutterのホットリスタート(自分はついホットリロードと呼んでしまいがち)を行うと、firebase realtime database へのアクセスにエラーが出るようになった。

Flutter WebのHot-RestartでStream.listenが多重化してしまう問題 – 開発日記(73) – アイディア・レーン開発ブログ

GitHubのissueとしても報告されていているのでいつか直るかなぁとのんきに構えているが、ホットリスタートするだけでエラーが頻繁することになり生産性の低下を感じていた。

とにかくDBアクセスが原因なので、当面の対策として、データベースへの書き込みをオフにするオプションを付けてみた。これでホットリスタート時の問題を軽減できるはず。
→しかしなんだか思ったような効果が得られず、別のエラーが発生するようになった。きちんと調べないと解決は出来なさそうだ。

RealtimeDBのトランザクション処理 2024/03/19

キャンバスの総数をDBに格納するために、Firebase Realtime Databaseのトランザクション処理を試した。

  • firebaseの公式サンプルプログラムや、ネット上に出ているサンプルがなかなか動かない。runTransactionの引数が何が正しいかよく分からず、Transaction.success を記述してもコンパイルが通らないなど混乱。
  • かなりさまよった挙げ句、最終的には自分のソースのimportで firebase_database(Realtime Database)とcloud_firestore(FireStore)が両方記載されているのが原因だった。これに気づくまで時間がかかってしまった…。

トランザクション処理を行うサンプルは、このような感じ。

// deltaに値を渡すと、DBの値をその分増やす
Future<void> updateCanvasCount(int delta) async {
  userInfoRef.child("canvasAll").runTransaction((transaction) {
    final value = (transaction as int? ?? 0) + delta;
    _allCanvasCount = value; //ローカルの変数に代入
    return Transaction.success(value);
  });
}

その他、細かい不具合の修正や使い勝手の改善をたくさん行った。
またキャンバスのコピー機能についてはリレーション含めて動作するようになった。


※開発日記は当時の記録をもとに作成し、必要に応じて加筆・補足しています

この記事はアイディア整理ソフト「idea Lane」の開発記録です

どなたでも、ユーザ登録だけで無料ですぐに使えます
テキストベースの思考整理ツール「idea Lane」


コメント

タイトルとURLをコピーしました