feat(app): offline-кэш на остальных экранах — фаза 5

accounts, cashflow, categories, goals, income, portfolio (+instrument),
rebalance, tax, rules переведены на Cached<T> по контракту
docs/ai/offline-cache.md. Общие/второстепенные селекторы (scopesProvider,
categoriesListProvider и т.п.) оставлены как есть — не основной контент
экрана. sync_page.dart и settings_page.dart не тронуты (первый — заменён
health-page отдельно, второй — чистые действия без списка для баннера).
This commit is contained in:
Dmitry
2026-09-19 14:00:13 +03:00
parent ffc5ed959a
commit 7b419f4188
39 changed files with 388 additions and 186 deletions
+16 -4
View File
@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/cache/cached.dart';
import '../../core/widgets/stale_banner.dart';
import 'data/tax_api.dart';
import 'lots_tab.dart';
import 'providers.dart';
@@ -16,6 +18,11 @@ class TaxPage extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final stale = oldestFetch([
ref.watch(taxSummaryProvider).valueOrNull?.fetchedAt,
ref.watch(taxLotsProvider).valueOrNull?.fetchedAt,
]);
return DefaultTabController(
length: 2,
child: Scaffold(
@@ -33,10 +40,15 @@ class TaxPage extends ConsumerWidget {
tabs: [Tab(text: 'Сводка за год'), Tab(text: 'Лоты и ЛДВ')],
),
),
body: const Column(
body: Column(
children: [
EstimateBanner(),
Expanded(child: TabBarView(children: [TaxSummaryTab(), TaxLotsTab()])),
const EstimateBanner(),
if (stale != null)
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 12),
child: StaleBanner(fetchedAt: stale),
),
const Expanded(child: TabBarView(children: [TaxSummaryTab(), TaxLotsTab()])),
],
),
),
@@ -50,7 +62,7 @@ class EstimateBanner extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final summary = ref.watch(taxSummaryProvider).valueOrNull;
final summary = ref.watch(taxSummaryProvider).valueOrNull?.data;
final scheme = Theme.of(context).colorScheme;
final text = summary?.disclaimer ?? TaxSummary.defaultDisclaimer;