import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:luojigou_thinking_core/luojigou_thinking_core.dart'; class Demo3 extends StatefulWidget { const Demo3({Key? key}) : super(key: key); @override State createState() => _Demo3State(); } class _Demo3State extends State { @override Widget build(BuildContext context) { return ColoredBox( color: Colors.black, child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.only(top: 20,left: 20,right: 20), child: TrapezoidBox( mainAxisSpacing: 16, padding: const EdgeInsets.symmetric( horizontal: 40, vertical: 60, ), background: Colors.white, children: const [ _HitTestBox( size: Size(double.infinity, 300), ), _HitTestBox( size: Size(double.infinity, 100), ), _HitTestBox( size: Size(double.infinity, 200), ), _HitTestBox( size: Size(double.infinity, 400), ), _HitTestBox( size: Size(double.infinity, 200), ), _HitTestBox( size: Size(double.infinity, 200), ), // Container( // width: double.infinity, // height: 200, // color: Colors.green, // ), // Container( // width: double.infinity, // height: 200, // color: Colors.red, // ), // Container( // width: double.infinity, // height: 200, // color: Colors.orange, // ), ], ), ), ), ); } } class _HitTestBox extends LeafRenderObjectWidget { final Size size; const _HitTestBox({ this.size = Size.zero, }); @override RenderObject createRenderObject(BuildContext context) { return _RenderHitTestBox(size); } @override void updateRenderObject( BuildContext context, covariant _RenderHitTestBox renderObject) { renderObject.setSize(size); } } class _RenderHitTestBox extends RenderBox { _RenderHitTestBox(this._size); Color _color = Colors.deepPurple; Size _size; void setSize(Size value) { _size = value; markNeedsLayout(); } @override void performResize() { assert(false); } @override void performLayout() { size = constraints.constrain(_size); } @override bool hitTestSelf(Offset position) => size.contains(position); @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { super.handleEvent(event, entry); if (event is PointerDownEvent) { _color = Colors.yellow; } else if (event is PointerUpEvent) { _color = Colors.deepPurple; } markNeedsPaint(); } @override void paint(PaintingContext context, Offset offset) { context.canvas.drawRect(offset & size, Paint()..color = _color); } }