gpt4 book ai didi

dart - 在 Flutter 中,如何为无状态小部件定义基线?

转载 作者:IT老高 更新时间:2023-10-28 12:45:15 25 4
gpt4 key购买 nike

我创建了一个无状态小部件,我想为它定义一个基线,以便我可以将它与基线小部件 (https://docs.flutter.io/flutter/widgets/Baseline-class.html) 一起使用。

我该怎么做?

最佳答案

如果您想定义基线,您不能直接在无状态小部件中进行。你需要弄乱它对应的需要实现 computeDistanceToActualBaseline() 方法的 RenderBox

看看 ListTile 实现 here .您将看到 _RenderListTile RenderBox 实现了上述方法,返回标题小部件的基线。

  @override
double computeDistanceToActualBaseline(TextBaseline baseline) {
assert(title != null);
final BoxParentData parentData = title.parentData;
return parentData.offset.dy + title.getDistanceToActualBaseline(baseline);
}

在这种情况下,标题的基线是 Text 小部件的底部。

所有这些都是必需的,因为 Baseline 小部件试图获取子小部件的基线。如果您没有为上述方法提供明确的基线,它只会使用其底部位置。

您可以在下面找到 BaselineBox 的示例,您可以在其中从顶部设置任意基线。

import 'package:flutter/widgets.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart';

class BaselineBox extends SingleChildRenderObjectWidget {
const BaselineBox({Key key, @required this.baseline, Widget child})
: assert(baseline != null),
super(key: key, child: child);

final double baseline;

@override
RenderBaselineBox createRenderObject(BuildContext context) =>
new RenderBaselineBox(baseline: baseline);

@override
void updateRenderObject(
BuildContext context, RenderBaselineBox renderObject) {
renderObject.baseline = baseline;
}

@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties.add(new DoubleProperty('baseline', baseline));
}
}

class RenderBaselineBox extends RenderProxyBox {
RenderBaselineBox({
RenderBox child,
@required double baseline,
}) : assert(baseline != null),
assert(baseline >= 0.0),
assert(baseline.isFinite),
_baseline = baseline,
super(child);

double get baseline => _baseline;
double _baseline;

set baseline(double value) {
assert(value != null);
assert(value >= 0.0);
assert(value.isFinite);
if (_baseline == value) return;
_baseline = value;
markNeedsLayout();
}

@override
double computeDistanceToActualBaseline(TextBaseline baselineType) {
return _baseline;
}

@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties.add(new DoubleProperty('baseline', baseline));
}
}

关于dart - 在 Flutter 中,如何为无状态小部件定义基线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51125756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com