import 'package:flutter/material.dart'; import 'package:flutter/src/gestures/events.dart'; class TolyBreadcrumb extends StatelessWidget { final List items; final ValueChanged? onTapItem; const TolyBreadcrumb({super.key, required this.items, this.onTapItem}); @override Widget build(BuildContext context) { List children = []; for (int i = 0; i < items.length; i++) { children.add(TolyBreadcrumbItem( item: items[i], onTapItem: onTapItem, )); if (i != items.length - 1) { children.add(Padding( padding: const EdgeInsets.symmetric(horizontal: 4.0), child: Text( '/', style: TextStyle(color: Colors.grey), ), )); } } return Wrap( children: children, ); } } class TolyBreadcrumbItem extends StatefulWidget { final BreadcrumbItem item; final ValueChanged? onTapItem; const TolyBreadcrumbItem({super.key, required this.item, required this.onTapItem}); @override State createState() => _TolyBreadcrumbItemState(); } class _TolyBreadcrumbItemState extends State { bool _hover = false; @override Widget build(BuildContext context) { bool hasTarget = (widget.item.to != null); Color? color = (_hover&&hasTarget)?Colors.blue:null; MouseCursor cursor = hasTarget?SystemMouseCursors.click:SystemMouseCursors.basic; if(widget.item.active) { color = null; cursor = SystemMouseCursors.basic; } TextStyle style = TextStyle( fontWeight: hasTarget ? FontWeight.bold : null, color: color ); return MouseRegion( cursor: cursor, onEnter: _onEnter, onExit: _onExit, child: GestureDetector( onTap: () { if(!widget.item.active){ widget.onTapItem?.call(widget.item); } }, child: Text(widget.item.label, style: style)), ); } void _onEnter(PointerEnterEvent event) { setState(() { _hover = true; }); } void _onExit(PointerExitEvent event) { setState(() { _hover = false; }); } } class BreadcrumbItem { final String? to; final String label; final bool active; BreadcrumbItem( {this.to, required this.label,this.active=false,}); } // // 首页 // 活动管理 // 活动列表 // 活动详情 //