Flutterアプリは公開クライアントです。bearer keyをアプリに入れず、サーバー側/api/fxで管理し、{from,to}とrate、source、market session、観測時刻を型付きモデルで扱います。
認証情報をサーバーの後ろに置く
サーバーrouteはfromとtoを受け、Authorizationを追加して/v1/latest/{from}?symbols={to}を呼びます。キーはサーバー環境に保存し、アプリには渡しません。
HTTP依存関係を追加する
http packageをpubspec.yamlに追加してFlutter converterをlib/main.dartに保存します。flutter run --dart-define=FX_PROXY_BASE_URL=https://your-app.example/api/fxで実行します。Node 20以上でproxyをEXCHANGERATE_API_KEY付きでnode flutter-currency-converter-proxy.mjsとして起動し、ローカルではloopback 8787を使います。端末接続前は認証付きHTTPSとリクエスト制限を用意します。Flutterの公式networking recipeも参照してください。
quoteを検証する
rateが欠落、正でない、有限でない、非数値、またはdata_updated_at欠落なら拒否します。10秒timeoutと非2xxも表示します。
loading、error、鮮度を表示する
loading中はボタンを無効にし、金額、rate、source、session、観測時刻、アプリcache age、観測ageを表示します。
表示用に丸める
JPYは小数0桁、USD・EUR・GBP・IDRは2桁、rateは6桁で表示します。値は保持し、決済記録に表示値を使いません。
顧客経路をテストする
timeout、401/429、壊れたJSON、rate欠落、古いdata_updated_atを実機またはemulatorで確認します。ファイルはclient例でありhosted proxyではありません。
