Commit 94843700 authored by Adam Barth's avatar Adam Barth

ScrollbarPainter exception when scrolling MaterialList

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
parent 04d542b1
...@@ -313,8 +313,10 @@ class RenderBlockViewport extends RenderBlockBase { ...@@ -313,8 +313,10 @@ class RenderBlockViewport extends RenderBlockBase {
void set overlayPainter(Painter value) { void set overlayPainter(Painter value) {
if (_overlayPainter == value) if (_overlayPainter == value)
return; return;
if (attached)
_overlayPainter?.detach(); _overlayPainter?.detach();
_overlayPainter = value; _overlayPainter = value;
if (attached)
_overlayPainter?.attach(this); _overlayPainter?.attach(this);
markNeedsPaint(); markNeedsPaint();
} }
......
...@@ -345,6 +345,7 @@ abstract class Painter { ...@@ -345,6 +345,7 @@ abstract class Painter {
void attach(RenderObject renderObject) { void attach(RenderObject renderObject) {
assert(_renderObject == null); assert(_renderObject == null);
assert(renderObject != null);
_renderObject = renderObject; _renderObject = renderObject;
} }
......
// Copyright 2015 The Chromium 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:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:test/test.dart';
import 'rendering_tester.dart';
class TestBlockPainter extends Painter {
void paint(PaintingContext context, Offset offset) { }
}
void main() {
test('overlay painters can attach and detach', () {
TestBlockPainter first = new TestBlockPainter();
TestBlockPainter second = new TestBlockPainter();
RenderBlockViewport block = new RenderBlockViewport(overlayPainter: first);
// The first painter isn't attached because we haven't attached block.
expect(first.renderObject, isNull);
expect(second.renderObject, isNull);
block.overlayPainter = second;
expect(first.renderObject, isNull);
expect(second.renderObject, isNull);
layout(block);
expect(first.renderObject, isNull);
expect(second.renderObject, equals(block));
block.overlayPainter = first;
expect(first.renderObject, equals(block));
expect(second.renderObject, isNull);
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment