mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-04-20 11:08:03 +08:00
83
lib/common/widgets/flutter/sliver_layout_builder.dart
Normal file
83
lib/common/widgets/flutter/sliver_layout_builder.dart
Normal file
@@ -0,0 +1,83 @@
|
||||
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
import 'package:flutter/widgets.dart'
|
||||
hide
|
||||
ConstrainedLayoutBuilder,
|
||||
LayoutBuilder,
|
||||
RenderConstrainedLayoutBuilder;
|
||||
|
||||
/// Builds a sliver widget tree that can depend on its own [SliverConstraints].
|
||||
///
|
||||
/// Similar to the [LayoutBuilder] widget except its builder should return a sliver
|
||||
/// widget, and [SliverLayoutBuilder] is itself a sliver. The framework calls the
|
||||
/// [builder] function at layout time and provides the current [SliverConstraints].
|
||||
/// The [SliverLayoutBuilder]'s final [SliverGeometry] will match the [SliverGeometry]
|
||||
/// of its child.
|
||||
///
|
||||
/// {@macro flutter.widgets.ConstrainedLayoutBuilder}
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
/// * [LayoutBuilder], the non-sliver version of this widget.
|
||||
class SliverLayoutBuilder extends ConstrainedLayoutBuilder<SliverConstraints> {
|
||||
/// Creates a sliver widget that defers its building until layout.
|
||||
const SliverLayoutBuilder({super.key, required super.builder});
|
||||
|
||||
@override
|
||||
RenderConstrainedLayoutBuilder<SliverConstraints, RenderSliver>
|
||||
createRenderObject(
|
||||
BuildContext context,
|
||||
) => _RenderSliverLayoutBuilder();
|
||||
}
|
||||
|
||||
class _RenderSliverLayoutBuilder extends RenderSliver
|
||||
with
|
||||
RenderObjectWithChildMixin<RenderSliver>,
|
||||
RenderObjectWithLayoutCallbackMixin,
|
||||
RenderConstrainedLayoutBuilder<SliverConstraints, RenderSliver> {
|
||||
@override
|
||||
double childMainAxisPosition(RenderObject child) {
|
||||
assert(child == this.child);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@override
|
||||
void performLayout() {
|
||||
runLayoutCallback();
|
||||
child?.layout(constraints, parentUsesSize: true);
|
||||
geometry = child?.geometry ?? SliverGeometry.zero;
|
||||
}
|
||||
|
||||
@override
|
||||
void applyPaintTransform(RenderObject child, Matrix4 transform) {
|
||||
assert(child == this.child);
|
||||
// child's offset is always (0, 0), transform.translate(0, 0) does not mutate the transform.
|
||||
}
|
||||
|
||||
@override
|
||||
void paint(PaintingContext context, Offset offset) {
|
||||
// This renderObject does not introduce additional offset to child's position.
|
||||
if (child?.geometry?.visible ?? false) {
|
||||
context.paintChild(child!, offset);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
bool hitTestChildren(
|
||||
SliverHitTestResult result, {
|
||||
required double mainAxisPosition,
|
||||
required double crossAxisPosition,
|
||||
}) {
|
||||
return child != null &&
|
||||
child!.geometry!.hitTestExtent > 0 &&
|
||||
child!.hitTest(
|
||||
result,
|
||||
mainAxisPosition: mainAxisPosition,
|
||||
crossAxisPosition: crossAxisPosition,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user