feat: load real transaction history in demo app#102
Conversation
…tate and native resource disposal
…from widget tests
|
Hi @j-kon, nice work here I noticed something. The Steps to reproduce: load wallet A → open Transactions → Load Transaction History → switch to wallet B → reopen Transactions. It still shows wallet A's transactions; tapping one resolves against B's repository and 404s as "Transaction not found." The sibling providers already handle this by keying off wallet identity, blockchain_providers.dart resets when activeWalletRecordProvider.id changes. Might be worth having the controller watch an activeWalletId (or ref.listen the record and reset) instead of a bool. Happy to be corrected if in-place switching isn't a supported flow. |
|
Thanks for the detailed. You were right that the transaction state was scoped only to wallet availability rather than the logical active wallet. I updated the transaction list and detail flow to use the active wallet record ID. Switching from wallet A to wallet B now clears the previous wallet’s transaction state, and stale asynchronous results are ignored if the active wallet changes before loading completes. I also added coverage for wallet switching so transaction list and detail data cannot leak between active wallets. |
|
Thanks @j-kon |
| @override | ||
| TransactionsState build() => const TransactionsState.idle(); | ||
| TransactionsState build() { | ||
| final activeWalletId = ref.watch(activeWalletIdProvider); |
There was a problem hiding this comment.
tNACK e4c458c
Navigating to Transaction History on device throws:
setState() or markNeedsBuild() called during build. UncontrolledProviderScope … already building widget currently being built: TransactionsListPage
pls fix the rebuild + listen pattern, and add a widget coverage that mounts the list page with an active wallet so this can’t fail silently.
There was a problem hiding this comment.
Fixed in 969da23.
Transaction state is now an auto-disposed provider family keyed by wallet ID. Switching wallets clears old rows, and stale results cannot update the new wallet.
I also added real provider-chain widget coverage for mounting and switching wallets without overriding activeWalletIdProvider. All local tests and CI pass.
Johnosezele
left a comment
There was a problem hiding this comment.
Every time I leave the wallet/Home flow and navigate back to Transaction History, I land on "Transaction history not loaded yet" and have to tap Load Transaction History again, even right after a successful sync with txs already known to the wallet (Home shows the balance).
Likely related to transactionsControllerProvider being NotifierProvider.autoDispose.family keyed by wallet ID: leaving the page disposes the controller, so remount always returns TransactionsState.idle().
Please either:
- keep loaded history for the active wallet across navigations (drop autoDispose, or cache last success by wallet ID), or
- auto-load on page open when an active wallet is present,
and add widget coverage that pumps the list page, navigates away, returns and still shows (or auto-reloads) the previously loaded rows without an extra tap.
Johnosezele
left a comment
There was a problem hiding this comment.
After an incoming tx confirms, Home correctly updates (Balance + Trusted spendable reflect the synced wallet), but Transaction History can still show the earlier pending row until I leave, come back, and tap Reload Transaction History.
So for a while Home and History disagree: spendable says confirmed funds are available, history still says "Awaiting confirmation."
Root cause looks like split data paths:
- Home reads
wallet.balance()viabalanceSnapshotProvideron every successful sync - History only refreshes on explicit Load/Reload of
transactionsControllerProvider(and withautoDisposeit also drops to idle when leaving the route)
Please invalidate or auto-reload transaction history for the active wallet when sync completes (same moment balance is applied), so pending, confirmed cannot lag behind Home.
Widget coverage: load history while pending, then, apply post-sync wallet, and assert list shows confirmed without a manual reload.
|
Thanks @Johnosezele for the detailed review! I've updated PR #102 in commits
|
Summary
Context
Continues the transaction presentation scaffold from #62 by wiring the list/detail flow to active wallet transaction data instead of sample rows.
The production transaction repository still uses the BDK Dart API to read wallet transactions. Transaction state is now held by an auto-disposed provider family keyed by logical wallet ID, so changing wallets immediately exposes a fresh state while replacing the FFI wallet object for the same record does not reset loaded rows.
The wallet-switch widget regression creates a real
ProviderContainer, setsactiveWalletRecordProvider, and mountsTransactionsListPagewithUncontrolledProviderScope. It does not overrideactiveWalletIdProvider.Verification
dart format --output=none --set-exit-if-changed lib test example bdk_demo/lib bdk_demo/testdart analyze --fatal-infos --fatal-warnings lib test exampledart testflutter analyzeinsidebdk_demoflutter test --no-pub testinsidebdk_demoflutter test --no-pub test/features/transactions/transactions_controller_test.dartflutter test --no-pub test/presentation/transactions/transactions_list_page_test.dartValidation passed:
Also confirmed:
Wallettransactions_repository.dartstill imports and uses BDK