import 'package:flutter/material.dart'; import 'package:tangheem/widgets/auto_scroll_view/scroll_id.dart'; class AyaScrollViewer extends StatefulWidget { final ScrollToId scrollToId; final List children; final Axis scrollDirection; AyaScrollViewer({@required this.children, @required this.scrollToId, this.scrollDirection = Axis.vertical}); @override _InteractiveScrollViewerState createState() => _InteractiveScrollViewerState(); } class _InteractiveScrollViewerState extends State { List _idList = []; @override void initState() { super.initState(); setData(); } void setData() { widget.scrollToId.scrollDirection = widget.scrollDirection; _idList = []; widget.scrollToId.scrollContentsList = []; for (ScrollContent scrollContents in widget.children) { if (_idList.contains(scrollContents.id)) { throw Exception('Do not use the same id'); } else { _idList.add(scrollContents.id); } widget.scrollToId.scrollContentsList.add(ScrollContentWithKey.fromWithout(scrollContents)); } } @override void didUpdateWidget(covariant AyaScrollViewer oldWidget) { if (widget.children != oldWidget.children) { setData(); } super.didUpdateWidget(oldWidget); } @override Widget build(BuildContext context) { return SingleChildScrollView( scrollDirection: widget.scrollDirection, controller: widget.scrollToId.scrollController, physics: BouncingScrollPhysics(), child: buildContent(), ); } Widget buildContent() { if (widget.scrollDirection == Axis.vertical) { return Column( children: widget.scrollToId.scrollContentsList.map((scrollContents) { return buildRepaintBoundary(scrollContents); }).toList(), ); } else { return Row( children: widget.scrollToId.scrollContentsList.map((scrollContents) { return buildRepaintBoundary(scrollContents); }).toList(), ); } } RepaintBoundary buildRepaintBoundary(ScrollContentWithKey scrollContents) { return RepaintBoundary( key: scrollContents.key, child: scrollContents.child, ); } }