This makes it more consistent with tightFor(), and also makes it
easier to tighten both directions at once when you're not sure you
will always do so (e.g. if you have a height and width that might be
null, and want to tighten whichever ones aren't null).
- padding is shown in blue with a darker blue around the child
- spacing (empty size boxes or padding) is shown in gray
- alignment from a RenderPositionedBox is shown with yellow arrows
Previously, we triggered a layout (and hence a repaint) when sliding the
draw because we gave the draw loose constraints. The drawer uses an
Align to move itself to the proper side of the screen, so it can have
tight constraints, which makes it a layout boundary.
Also, don't trigger a layout just because the Scaffold rebuilds. There
isn't any state in the scaffold custom layout, so it doesn't need to
repaint just because we created a new instance of the delegate.
Finally, add the debugging infrastructure I used to find these issues.
- make them all have the same style
- make them all include the stack trace last
- make them all stop printing if their callback is set (if
appropriate, they don't yet all have callbacks)
I think I wanted to use this at some point but ended up going a
different direction. Instead, object.dart has a private field that
serves a similar purpose.
This patch also changed ScrollableList2 to use an Iterable instead of an
List for its children. This change lets clients map their underlying
data lazily. If the clients actually have a concrete list, we skip the
extra copy and grab the child list directly.
This patch implements the remaining missing features of ScrollableList2.
It should now be nearly a drop-in replacement for ScrollableList. The
next patch will switch callers over to the new machinery.
ScrollableList2 uses the same pattern as ScrollableGrid, which requires the
client to allocate widgets for every list item but doesn't inflate them unless
they're actually needed for the view. It improves on the original
ScrollableList by not requiring a rebuild of the whole visible portion of the
list when scrolling. In fact, small scrolls can often be handled entirely by
repainting.
We now support (vertically) scrollable grids with viewporting. If the
scroll doesn't reveal any new rows, we execute the scroll with a repaint
(i.e., no layout). If the scroll reveals a new row, we trigger a layout
to change the set of materialized children in the viewport.
This patch make grid layout much more flexible. The behavior is factored
out into a GridDelegate that's modeled after the custom layout
delegates. The patch includes a MaxTileWidthGridDelegate that implements
the old behavior and a FixedColumnCountGridDelegate that implements a
grid layout with a fixed number of columns.
Fixes#1048
When assigning a new overlayPainter, we were detaching the old overlay
painter even if the render object itself wasn't attached. Now we only
twiddle the attach/detach state of the overlay painter when we're
attached ourselves.
Fixes#1047
- Add RenderFractionalTranslation, a render box that does a
translation based on a FractionalOffset.
- Make FractionalOffset more like Offset
- dx/dy instead of x/y
- add /, ~/, %
- add .zero
- Add alongOffset and alongSize to FractionalOffset so that you can
easily apply FractionalOffset to Offsets and Sizes. (Better name
suggestions welcome.)
- Add transformHitTests boolean to RenderTransform (also on
RenderFractionalTranslation), and to classes based on it.
- Remove the fade from Dismissable. We can add it back using the
builder-with-child pattern like Draggable if we need it. See #1003
for tha feature request.
- Rename a bunch of variables in dismissable.dart.
- Change the test for dismissable to not handle leftwards dismisses
one pixel different from rightwards dismisses, and cleaned up the
resulting effect on the test (mostly making sure we had the right
number of pumps, with comments explaining what each one was).
Fixes#174.
Use the same technique for updating compositing bits as layout and
painting. This avoids walking the entire rendering tree when all you
need to update is a small subtree.
MultiChildLayoutDelegate and OnChildLayoutDelegate are now expected to be stateless, i.e. they'll typically be built each time their custom layout widget is built. If the identical layout delegate is provided to a new custom layout, layout will not happen.
Revised the bottom sheet implementation per the new custom layout classes. Removed a SizeObserver.
Fixes#899
Previously, applyPaintTransform() had to know how it was positioned in
its parent, even though that's really the parent's responsibility.
Now, applyPaintTransform() is given a child and applies the transform
that it would give the child during paint.
This makes it possible for applyPaintTransform() to work across
coordinate system boundaries (e.g. box to sector, or view to box --
previously, view to box only worked because we explicitly skipped that
step -- since view doesn't actually apply a transform, it doesn't
really matter).
- Adds dartdoc for all the `of` functions.
- Renames Image to RawImage. This widget is rarely used and shouldn't take up
such a nice global name.
Fixes#361
Add BoxConstraints.isNormalized feature.
Use this feature in asserts in all the intrinsic dimension methods, in
various relevant BoxConstraints methods, and in layout().
Wrap the _DebugSize logic in BoxConstraints.constrain() in an assert
block to avoid a branch in release mode.
Remove the logic in BoxConstraints.isSatisfiedBy() that dealt with
non-normalized values.
Add BoxConstraints.normalize().
Make RenderCustomOneChildLayoutBox.performLayout() only set
parentUsesSize on the child if the constraints aren't tight.
I had to add a setLocale method to WidgetTester and
split the code in FlutterBinding which handled locale
changes to allow me to dispatch a locale change w/o actually
changing what the c++ code reports as the locale.
Also added the test to Travis.
@abarth @jason-simmons