111
This commit is contained in:
@@ -108,4 +108,20 @@ class ApiEndpoints {
|
||||
|
||||
/// 每日盈亏
|
||||
static const String dailyProfit = '/api/asset/daily-profit';
|
||||
|
||||
// ==================== K线模块 ====================
|
||||
|
||||
/// K线历史数据
|
||||
static const String klineHistory = '/api/kline/history';
|
||||
|
||||
/// 当前K线
|
||||
static const String klineCurrent = '/api/kline/current';
|
||||
|
||||
/// 支持的K线周期
|
||||
static const String klineIntervals = '/api/kline/intervals';
|
||||
|
||||
/// K线 WebSocket 地址
|
||||
static const String klineWs = '${isProduction ? 'ws' : 'ws'}://'
|
||||
'${isProduction ? '8.155.172.147:5010' : 'localhost:5010'}'
|
||||
'/ws/kline';
|
||||
}
|
||||
|
||||
@@ -18,9 +18,12 @@ import 'data/services/trade_service.dart';
|
||||
import 'data/services/asset_service.dart';
|
||||
import 'data/services/fund_service.dart';
|
||||
import 'data/services/bonus_service.dart';
|
||||
import 'data/services/kline_service.dart';
|
||||
import 'data/services/kline_websocket_service.dart';
|
||||
import 'providers/auth_provider.dart';
|
||||
import 'providers/market_provider.dart';
|
||||
import 'providers/asset_provider.dart';
|
||||
import 'providers/kline_provider.dart';
|
||||
import 'providers/theme_provider.dart';
|
||||
import 'ui/pages/auth/login_page.dart';
|
||||
import 'ui/pages/main/main_page.dart';
|
||||
@@ -101,6 +104,8 @@ class MyApp extends StatelessWidget {
|
||||
Provider<AssetService>(create: (_) => AssetService(dioClient)),
|
||||
Provider<FundService>(create: (_) => FundService(dioClient)),
|
||||
Provider<BonusService>(create: (_) => BonusService(dioClient)),
|
||||
Provider<KlineService>(create: (_) => KlineService(dioClient)),
|
||||
Provider<KlineWebSocketService>(create: (_) => KlineWebSocketService()),
|
||||
// State Management
|
||||
ChangeNotifierProvider<AuthProvider>(
|
||||
create: (ctx) {
|
||||
@@ -120,6 +125,12 @@ class MyApp extends StatelessWidget {
|
||||
ctx.read<AppEventBus>(),
|
||||
),
|
||||
),
|
||||
ChangeNotifierProvider<KlineProvider>(
|
||||
create: (ctx) => KlineProvider(
|
||||
ctx.read<KlineService>(),
|
||||
ctx.read<KlineWebSocketService>(),
|
||||
),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import '../../../../core/theme/app_spacing.dart';
|
||||
import '../../../../core/theme/app_theme.dart';
|
||||
import '../../../../core/theme/app_theme_extension.dart';
|
||||
import '../../../../data/models/coin.dart';
|
||||
import '../../kline/kline_page.dart';
|
||||
import 'coin_avatar.dart';
|
||||
|
||||
/// 币种选择器组件
|
||||
@@ -60,6 +61,22 @@ class CoinSelector extends StatelessWidget {
|
||||
),
|
||||
],
|
||||
),
|
||||
// K线图标(仅选中币种后显示)
|
||||
if (selectedCoin != null)
|
||||
GestureDetector(
|
||||
onTap: () => _navigateToKline(context),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(AppSpacing.sm),
|
||||
decoration: BoxDecoration(
|
||||
color: context.appColors.surfaceCard,
|
||||
borderRadius: BorderRadius.circular(AppRadius.md),
|
||||
border: Border.all(color: context.appColors.ghostBorder),
|
||||
),
|
||||
child: Icon(LucideIcons.chartNoAxesColumn,
|
||||
size: 20, color: context.colors.primary),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: AppSpacing.sm),
|
||||
// 下拉箭头
|
||||
Icon(LucideIcons.chevronDown,
|
||||
size: 16, color: context.colors.onSurfaceVariant),
|
||||
@@ -69,6 +86,14 @@ class CoinSelector extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
|
||||
void _navigateToKline(BuildContext context) {
|
||||
if (selectedCoin == null) return;
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (_) => KlinePage(coin: selectedCoin!)),
|
||||
);
|
||||
}
|
||||
|
||||
void _showCoinPicker(BuildContext context) {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
|
||||
Reference in New Issue
Block a user