Skip to content

Instantly share code, notes, and snippets.

@mevans
Created May 2, 2019 07:46
Show Gist options
  • Save mevans/574a3bc3634107712df5fefbc397a36f to your computer and use it in GitHub Desktop.
Save mevans/574a3bc3634107712df5fefbc397a36f to your computer and use it in GitHub Desktop.
Split Pane for Flutter
class SplitPane extends StatefulWidget {
final Widget child1;
final Widget child2;
final double tapSize;
final double dividerSize;
const SplitPane({Key key, this.child1, this.child2, this.tapSize = 20, this.dividerSize = 5})
: super(key: key);
@override
_SplitPaneState createState() => _SplitPaneState();
}
class _SplitPaneState extends State<SplitPane> {
Offset dividerOffset;
@override
Widget build(BuildContext context) {
return Scaffold(
body: LayoutBuilder(
builder: (ctx, c) {
if (dividerOffset == null)
dividerOffset = Offset(c.biggest.width / 2, 0);
return Stack(
fit: StackFit.expand,
children: <Widget>[
Row(
children: <Widget>[
SizedBox(width: dividerOffset.dx, child: widget.child1),
Container(
width: widget.dividerSize,
color: Colors.grey,
),
SizedBox(
width: c.biggest.width - widget.dividerSize - dividerOffset.dx,
child: widget.child2
),
],
),
Positioned(
left: dividerOffset.dx - ((widget.tapSize) / 2) + (widget.dividerSize/2),
top: dividerOffset.dy,
child: GestureDetector(
onPanUpdate: (d) {
Offset newOffset = Offset(dividerOffset.dx + d.delta.dx, dividerOffset.dy);
if (c.biggest.width * 0.1 < newOffset.dx &&
c.biggest.width * 0.9 > newOffset.dx) {
setState(() {
dividerOffset = newOffset;
});
}
},
child: Container(
width: widget.tapSize,
height: c.biggest.height,
color: Colors.transparent,
),
),
)
],
);
},
),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment