shift_baseline.dart
2.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
class ShiftBaseline extends SingleChildRenderObjectWidget {
const ShiftBaseline({
Key? key,
this.relativePos,
this.offset = 0,
required Widget child,
}) : super(key: key, child: child);
final double? relativePos;
final double offset;
@override
RenderShiftBaseline createRenderObject(BuildContext context) =>
RenderShiftBaseline(relativePos: relativePos, offset: offset);
@override
void updateRenderObject(
BuildContext context, RenderShiftBaseline renderObject) {
renderObject
..relativePos = relativePos
..offset = offset;
}
}
class RenderShiftBaseline extends RenderProxyBox {
RenderShiftBaseline({
RenderBox? child,
double? relativePos,
double offset = 0,
}) : _relativePos = relativePos,
_offset = offset,
super(child);
double? get relativePos => _relativePos;
double? _relativePos;
set relativePos(double? value) {
if (_relativePos != value) {
_relativePos = value;
markNeedsLayout();
}
}
double get offset => _offset;
double _offset;
set offset(double value) {
if (_offset != value) {
_offset = value;
markNeedsLayout();
}
}
var _height = 0.0;
@override
Size computeDryLayout(BoxConstraints constraints) =>
child?.getDryLayout(constraints) ?? Size.zero;
@override
double? computeDistanceToActualBaseline(TextBaseline baseline) {
if (relativePos != null) {
return relativePos! * _height + offset;
}
if (child != null) {
// assert(!debugNeedsLayout);
final childBaselineDistance =
child!.getDistanceToActualBaseline(baseline) ?? _height;
//ignore: avoid_returning_null
// if (childBaselineDistance == null) return null;
return childBaselineDistance + offset;
} else {
return super.computeDistanceToActualBaseline(baseline);
}
}
@override
void performLayout() {
super.performLayout();
// We have to hack like this to know the height of this object!!!
_height = size.height;
}
}