blob: 6893cf1909ff5bdeba9271fd8d7cc00fc512e1fb [file] [log] [blame]
// Copyright 2022 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.
@TestOn('vm')
library;
import 'package:devtools_app/src/shared/primitives/extent_delegate_list.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
class TestRenderSliverBoxChildManager extends RenderSliverBoxChildManager {
TestRenderSliverBoxChildManager({
required this.children,
required this.extentDelegate,
});
late RenderSliverExtentDelegateBoxAdaptor _renderObject;
bool _renderObjectInitialized = false;
List<RenderBox> children;
RenderSliverExtentDelegateBoxAdaptor createRenderSliverExtentDelegate() {
assert(!_renderObjectInitialized);
_renderObject = RenderSliverExtentDelegateBoxAdaptor(
childManager: this,
extentDelegate: extentDelegate,
);
_renderObjectInitialized = true;
return _renderObject;
}
final ExtentDelegate extentDelegate;
int? _currentlyUpdatingChildIndex;
@override
void createChild(int index, {required RenderBox? after}) {
if (index < 0 || index >= children.length) return;
try {
_currentlyUpdatingChildIndex = index;
_renderObject.insert(children[index], after: after);
} finally {
_currentlyUpdatingChildIndex = null;
}
}
@override
void removeChild(RenderBox child) {
_renderObject.remove(child);
}
@override
double estimateMaxScrollOffset(
SliverConstraints constraints, {
int? firstIndex,
int? lastIndex,
double? leadingScrollOffset,
double? trailingScrollOffset,
}) {
assert(lastIndex! >= firstIndex!);
return children.length *
(trailingScrollOffset! - leadingScrollOffset!) /
(lastIndex! - firstIndex! + 1);
}
@override
int get childCount => children.length;
@override
void didAdoptChild(RenderBox child) {
assert(_currentlyUpdatingChildIndex != null);
final childParentData = child.parentData as SliverMultiBoxAdaptorParentData;
childParentData.index = _currentlyUpdatingChildIndex;
}
@override
void setDidUnderflow(bool value) {}
}