Skip to content

Commit

Permalink
Copybara sync (#3)
Browse files Browse the repository at this point in the history
* Initial commit of LinkedScrollController

PiperOrigin-RevId: 220688858

* Correct typos in readme.md

PiperOrigin-RevId: 220697252

* Fix travis.sh

Closes #4

PiperOrigin-RevId: 220704036
  • Loading branch information
DaveShuckerow authored Nov 8, 2018
1 parent abc4781 commit 148fcbe
Show file tree
Hide file tree
Showing 8 changed files with 735 additions and 6 deletions.
10 changes: 5 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
language: dart
sudo: false
dart:
- stable
- dev
os: linux
before_script:
- git clone https://github.com/flutter/flutter.git --depth 1
- export PATH=`pwd`/flutter/bin:`pwd`/flutter/bin/cache/dart-sdk/bin:$PATH
- flutter doctor
script: ./tool/travis.sh
5 changes: 5 additions & 0 deletions gallery/lib/gallery.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
import 'package:gallery/src/linked_scroll_controller_page.dart';
import 'package:gallery/src/tagged_text_page.dart';
import 'package:gallery/src/html_widget_page.dart' as html_latency;

Expand All @@ -20,6 +21,10 @@ class Gallery extends StatefulWidget {
..add(new _GalleryPage(
title: 'Tagged Text',
pageBuilder: (context) => new TaggedTextPage(),
))
..add(new _GalleryPage(
title: 'Linked Scrollables',
pageBuilder: (context) => new LinkedScrollablesPage(),
));

@override
Expand Down
84 changes: 84 additions & 0 deletions gallery/lib/src/linked_scroll_controller_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// Copyright 2018 the Dart project 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

import 'package:flutter/material.dart';
import 'package:flutter_widgets/flutter_widgets.dart';

/// Gallery page for demoing the [LinkedScrollControllerGroup].
class LinkedScrollablesPage extends StatefulWidget {
@override
_LinkedScrollablesPageState createState() => _LinkedScrollablesPageState();
}

class _LinkedScrollablesPageState extends State<LinkedScrollablesPage> {
LinkedScrollControllerGroup _controllers;
ScrollController _letters;
ScrollController _numbers;

@override
void initState() {
super.initState();
_controllers = LinkedScrollControllerGroup();
_letters = _controllers.addAndGet();
_numbers = _controllers.addAndGet();
}

@override
void dispose() {
_letters.dispose();
_numbers.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(title: new Text('Linked Scrollables')),
body: Row(
children: [
Expanded(
child: ListView(
controller: _letters,
children: <Widget>[
_Tile('Hello A'),
_Tile('Hello B'),
_Tile('Hello C'),
_Tile('Hello D'),
_Tile('Hello E'),
],
),
),
Expanded(
child: ListView(
controller: _numbers,
children: <Widget>[
_Tile('Hello 1'),
_Tile('Hello 2'),
_Tile('Hello 3'),
_Tile('Hello 4'),
_Tile('Hello 5'),
],
),
),
],
),
);
}
}

class _Tile extends StatelessWidget {
final String caption;

_Tile(this.caption);

@override
Widget build(_) => Container(
margin: const EdgeInsets.all(8.0),
padding: const EdgeInsets.all(8.0),
height: 250.0,
child: Center(child: Text(caption)),
);
}
2 changes: 2 additions & 0 deletions gallery/test/widget_loading_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ void main() {
// Each test name matches against a tile in the top level of `gallery.dart`.
// This is necessary because we can't import gallery.dart here.
const taggedText = 'Tagged Text';
const linkedScrollables = 'Linked Scrollables';

/// Factory for test methods against widget loading times.
///
Expand Down Expand Up @@ -52,5 +53,6 @@ void main() {
// run of the app. Make sure to return the app to the entry point after
// each test.
test(taggedText, buildWidgetLoadingTest(taggedText));
test(linkedScrollables, buildWidgetLoadingTest(linkedScrollables));
});
}
92 changes: 92 additions & 0 deletions lib/src/linked_scroll_controller/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# linked_scroll_controller

This package provides a way to set up a set of scrollable widgets whose
scrolling is synchronized. The set can be stable across the lifetime of the
containing screen, or can change dynamically (for example, a vertically
scrolling `ListView.builder()` whose items are Scrollables that scroll
horizontally in unison).

**If you add controllers dynamically, the corresponding scrollables must be
given unique keys to avoid the scroll offset going out of sync.**

# Example usage

The code below sets up two side-by-side `ListView`s that scroll in unison.

```dart
class LinkedScrollables extends StatefulWidget {
@override
_LinkedScrollablesState createState() => _LinkedScrollablesState();
}
class _LinkedScrollablesState extends State<LinkedScrollables> {
LinkedScrollControllerGroup _controllers;
ScrollController _letters;
ScrollController _numbers;
@override
void initState() {
super.initState();
_controllers = LinkedScrollControllerGroup();
_letters = _controllers.addAndGet();
_numbers = _controllers.addAndGet();
}
@override
void dispose() {
_letters.dispose();
_numbers.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.ltr,
child: Row(
children: [
Expanded(
child: ListView(
controller: _letters,
children: <Widget>[
_Tile('Hello A'),
_Tile('Hello B'),
_Tile('Hello C'),
_Tile('Hello D'),
_Tile('Hello E'),
],
),
),
Expanded(
child: ListView(
controller: _numbers,
children: <Widget>[
_Tile('Hello 1'),
_Tile('Hello 2'),
_Tile('Hello 3'),
_Tile('Hello 4'),
_Tile('Hello 5'),
],
),
),
],
),
);
}
}
class _Tile extends StatelessWidget {
final String caption;
_Tile(this.caption);
@override
Widget build(_) => Container(
margin: const EdgeInsets.all(8.0),
padding: const EdgeInsets.all(8.0),
height: 250.0,
child: Center(child: Text(caption)),
);
}
```
Loading

0 comments on commit 148fcbe

Please sign in to comment.