Импорт (/imports, /instruments/pending) и фаза 4 (/goals, /income, /rebalance, /tax, аналитика-хаб с benchmarks_card) — по docs/ai/import-contract.md и docs/ai/phase4-contract.md. file_picker для загрузки отчёта.
41 lines
1.3 KiB
Dart
41 lines
1.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../../core/widgets/scope_selector.dart';
|
|
import 'calendar_tab.dart';
|
|
import 'forecast_tab.dart';
|
|
import 'history_tab.dart';
|
|
import 'providers.dart';
|
|
|
|
/// Доходы: the dividend/coupon calendar, the paid history and the forecast — three views of
|
|
/// one question, so three tabs of one screen rather than three navigation destinations.
|
|
class IncomePage extends ConsumerWidget {
|
|
const IncomePage({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
return DefaultTabController(
|
|
length: 3,
|
|
child: Scaffold(
|
|
appBar: AppBar(
|
|
title: const Text('Доходы'),
|
|
actions: [
|
|
const ScopeSelector(),
|
|
IconButton(
|
|
tooltip: 'Обновить',
|
|
icon: const Icon(Icons.refresh),
|
|
onPressed: () => invalidateIncomeProviders(ref),
|
|
),
|
|
],
|
|
bottom: const TabBar(
|
|
tabs: [Tab(text: 'Календарь'), Tab(text: 'История'), Tab(text: 'Прогноз')],
|
|
),
|
|
),
|
|
body: const TabBarView(
|
|
children: [IncomeCalendarTab(), IncomeHistoryTab(), IncomeForecastTab()],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|