马良AI写作初始化仓库

This commit is contained in:
邓滨杰
2025-09-10 00:07:52 +08:00
parent 3c06bb1a03
commit 39c0f8840f
1309 changed files with 318528 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
import 'package:flutter/material.dart';
import 'package:ainoval/utils/web_theme.dart';
/// 通用视图切换组件
class AppViewToggle extends StatelessWidget {
const AppViewToggle({
super.key,
required this.isGridView,
required this.onViewTypeChanged,
this.gridIcon = Icons.grid_view,
this.listIcon = Icons.view_list,
this.size = 18,
});
final bool isGridView;
final ValueChanged<bool> onViewTypeChanged;
final IconData gridIcon;
final IconData listIcon;
final double size;
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final isDark = WebTheme.isDarkMode(context);
return Container(
decoration: BoxDecoration(
border: Border.all(
color: isDark ? WebTheme.darkGrey400 : WebTheme.grey300,
),
borderRadius: BorderRadius.circular(6),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
_ToggleButton(
icon: gridIcon,
isSelected: isGridView,
isFirst: true,
onTap: () => onViewTypeChanged(true),
size: size,
),
_ToggleButton(
icon: listIcon,
isSelected: !isGridView,
isFirst: false,
onTap: () => onViewTypeChanged(false),
size: size,
),
],
),
);
}
}
/// 切换按钮内部组件
class _ToggleButton extends StatelessWidget {
const _ToggleButton({
required this.icon,
required this.isSelected,
required this.isFirst,
required this.onTap,
required this.size,
});
final IconData icon;
final bool isSelected;
final bool isFirst;
final VoidCallback onTap;
final double size;
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final isDark = WebTheme.isDarkMode(context);
return Material(
color: Colors.transparent,
child: InkWell(
onTap: onTap,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(isFirst ? 5 : 0),
bottomLeft: Radius.circular(isFirst ? 5 : 0),
topRight: Radius.circular(isFirst ? 0 : 5),
bottomRight: Radius.circular(isFirst ? 0 : 5),
),
child: Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: isSelected
? theme.colorScheme.primary.withOpacity(0.1)
: Colors.transparent,
border: isFirst
? Border(
right: BorderSide(
color: isDark ? WebTheme.darkGrey400 : WebTheme.grey300,
width: 0.5,
),
)
: null,
),
child: Icon(
icon,
size: size,
color: isSelected
? theme.colorScheme.primary
: theme.colorScheme.onSurfaceVariant,
),
),
),
);
}
}