問題タブ [hexagonal-architecture]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - データベースから上書き確認ダイアログを呼び出す
バックグラウンド
UI (アプリ)、ドメイン、およびデータベース (ルーム) を個別のモジュールとして、六角形のアーキテクチャとしてアプリをセットアップしています。UI のボタンを押すと、ユーザー入力データがルーム データベースに保存されます。Room データベースがSQLiteConstraintException
キーが DB に既に存在するという意味をスローする場合、データを上書きするかどうかをユーザーに問い合わせたいと思います。
私のアイデア
私はアンドロイド/コトリン開発に不慣れですが、これがどのように機能すると想像するかは、UIアラートダイアログをトリガーするイベントがあることです。DB モジュールでこのイベントを発生させ、アラート ダイアログが受け入れられた場合、コールバックが Room DAO で save メソッドを実行し、データを上書きします。
問題点
- Kotlin のイベントに関するドキュメントをいくつか見つけようとしましたが、何もありませんでした。正しい用語を使用していない可能性がありますが、「イベント」は Kotlin では認識されていないようです。
- DB モジュールは UI モジュールを認識しないため、ダイアログを DB から直接作成することはできません。これが、そもそもイベントを使用したい理由です。
- Room は非同期であるため、保存メソッドを
Dispatchers.IO
コルーチンで実行しています。私の知る限り、IO コルーチンで UI フラグメント (ダイアログなど) を作成することはできません。これまでのところ、使用してこの問題を回避してきましthis@MyActivity.runOnUiThread
たが、それは非常にハッキリしています。
私が試したこと
それで、最初の試みの私のハックジョブはうまくいきますが、まったく満足していません。このコードは、保存ボタンが押されたときに呼び出されるビューモデルのメソッドにあります。
data.save()
Dao が a を上げる場合は false を返し、それ以外の場合はSQLiteConstraintException
true を返します。引数は、またはforce
を使用してデータを保存するかどうかを決定します。基本的に true の場合は既存のキーを上書きし、false の場合は SQL エラーをスローします。保存に失敗すると、ダイアログが作成され、強制的に上書きして再保存するコールバックが提供されます。onConflict = ABORT
onClonflict = REPLACE
force
ロジックをクリーンアップするために、Kotlin でイベントまたは同等のものを使用することをお勧めします。
flutter - Future関数でジェネリックパラメータをどのように適切に処理しますか?
Flutterアプリケーションに Hexagonal Architecture を実装しています。認証のために、後で認証リポジトリに継承されるインターフェースを作成しました。
2 つの関数は一般的なパラメーターを使用します。1 つは認証サービス (この場合は Amplify Cognito) まで変更できるソーシャル サインアップ用で、もう 1 つは変更可能なユーザー属性 (サービスまで) を受け取ります。
まあ、リポジトリでそれらをオーバーライドすることは問題ではありませんが、コードレベルで厄介なエラーが発生しています:
ご覧のとおり、型は*で異なります (これはC++のポインターを意味するため、理解できません):
The argument type 'AuthProvider' can't be assigned to the parameter type 'AuthProvider*'.dartargument_type_not_assignable.
この場合、次のエラーが表示されます。
それ以外の場合は、次のようになります
A value of type 'List<AuthUserAttribute*>*' can't be assigned to a variable of type 'List<AuthUserAttribute>'. Try changing the type of the variable, or casting the right-hand type to 'List<AuthUserAttribute>'.dartinvalid_assignment
。
コードは次のとおりです。
両方の場合の共通点は、これらの関数を定義したジェネリック型です。
この問題は、ジェネリックを使用するときにのみ発生します。他の場合は発生しません。ソーシャル認証プロバイダーのタイプを変更したいFirebaseプロバイダーに変更する場合、原因に影響します。
この不一致の問題を解決するにはどうすればよいですか?
どうもありがとうございました。