Jaime Blasco

Temporary replace of PrimaryScrollController

 This issue would be solved first https://github.com/flutter/flutter/issues/64236
... ... @@ -92,7 +92,7 @@ class PhotoShareBottomSheet extends StatelessWidget {
appBar: appBar(context),
body: CustomScrollView(
physics: ClampingScrollPhysics(),
primary: true,
controller: ModalScrollController.of(context),
slivers: <Widget>[
SliverSafeArea(
bottom: false,
... ...
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
class ComplexModal extends StatelessWidget {
const ComplexModal({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
final scrollController = PrimaryScrollController.of(context);
return Material(
child: WillPopScope(
onWillPop: () async {
... ... @@ -47,8 +45,7 @@ class ComplexModal extends StatelessWidget {
bottom: false,
child: ListView(
shrinkWrap: true,
controller: scrollController,
controller: ModalScrollController.of(context),
children: ListTile.divideTiles(
context: context,
tiles: List.generate(
... ...
... ... @@ -9,7 +9,6 @@ class ModalInsideModal extends StatelessWidget {
@override
Widget build(BuildContext context) {
final scrollController = PrimaryScrollController.of(context);
return Material(
child: CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
... ... @@ -19,7 +18,7 @@ class ModalInsideModal extends StatelessWidget {
child: ListView(
reverse: reverse,
shrinkWrap: true,
controller: scrollController,
controller: ModalScrollController.of(context),
physics: ClampingScrollPhysics(),
children: ListTile.divideTiles(
context: context,
... ...
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
class ModalWithNavigator extends StatelessWidget {
... ... @@ -8,7 +9,6 @@ class ModalWithNavigator extends StatelessWidget {
@override
Widget build(BuildContext context) {
final scrollController = PrimaryScrollController.of(context);
return Material(
child: Navigator(
onGenerateRoute: (_) => MaterialPageRoute(
... ... @@ -20,7 +20,7 @@ class ModalWithNavigator extends StatelessWidget {
bottom: false,
child: ListView(
shrinkWrap: true,
controller: scrollController,
controller: ModalScrollController.of(context),
children: ListTile.divideTiles(
context: context,
tiles: List.generate(
... ...
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
class NestedScrollModal extends StatelessWidget {
const NestedScrollModal({Key key}) : super(key: key);
... ... @@ -7,7 +8,6 @@ class NestedScrollModal extends StatelessWidget {
@override
Widget build(BuildContext context) {
final scrollController = PrimaryScrollController.of(context);
return NestedScrollView(
controller: ScrollController(),
physics: ScrollPhysics(parent: PageScrollPhysics()),
... ... @@ -23,7 +23,7 @@ class NestedScrollModal extends StatelessWidget {
];
},
body: ListView.builder(
controller: scrollController,
controller: ModalScrollController.of(context),
itemBuilder: (context, index) {
return Container(
height: 100,
... ...
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
class ModalWithScroll extends StatelessWidget {
const ModalWithScroll({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
final scrollController = PrimaryScrollController.of(context);
return Material(
child: CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
... ... @@ -15,7 +16,7 @@ class ModalWithScroll extends StatelessWidget {
bottom: false,
child: ListView(
shrinkWrap: true,
controller: scrollController,
controller: ModalScrollController.of(context),
children: ListTile.divideTiles(
context: context,
tiles: List.generate(
... ...
... ... @@ -4,3 +4,4 @@ export 'src/material_with_modal_page_route.dart';
export 'src/bottom_sheets/cupertino_bottom_sheet.dart';
export 'src/bottom_sheets/material_bottom_sheet.dart';
export 'src/bottom_sheets/bar_bottom_sheet.dart';
export 'src/utils/modal_scroll_controller.dart';
\ No newline at end of file
... ...
... ... @@ -10,7 +10,7 @@ import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/widgets.dart';
import 'package:modal_bottom_sheet/src/utils/primary_scroll_status_bar.dart';
import 'package:modal_bottom_sheet/src/utils/scroll_to_top_status_bar.dart';
import 'package:modal_bottom_sheet/src/utils/bottom_sheet_suspended_curve.dart';
... ... @@ -282,7 +282,7 @@ class _ModalBottomSheetState extends State<ModalBottomSheet>
return;
}
// Otherwise the calculate the velocity with a VelocityTracker
// Otherwise the calculate the velocity with a VelocityTracker
if (_velocityTracker == null) {
_velocityTracker = VelocityTracker();
_startTime = DateTime.now();
... ... @@ -385,7 +385,10 @@ class _ModalBottomSheetState extends State<ModalBottomSheet>
child: RepaintBoundary(child: child),
);
return PrimaryScrollStatusBarHandler(child: child);
return ScrollToTopStatusBarHandler(
child: child,
scrollController: _scrollController,
);
}
}
... ...
... ... @@ -3,6 +3,7 @@ import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:modal_bottom_sheet/src/utils/modal_scroll_controller.dart';
import '../modal_bottom_sheet.dart';
... ... @@ -74,10 +75,10 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> {
@override
Widget build(BuildContext context) {
assert(debugCheckHasMediaQuery(context));
return PrimaryScrollController(
controller: PrimaryScrollController.of(context) ??
(_scrollController ??= ScrollController()),
final scrollController = PrimaryScrollController.of(context) ??
(_scrollController ??= ScrollController());
return ModalScrollController(
controller: scrollController,
child: Builder(
builder: (context) => AnimatedBuilder(
animation: widget.route._animationController,
... ... @@ -107,7 +108,7 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> {
child: child,
enableDrag: widget.enableDrag,
bounce: widget.bounce,
scrollController: PrimaryScrollController.of(context),
scrollController: scrollController,
animationCurve: widget.animationCurve,
),
);
... ...
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
/// Associates a [ScrollController] with a subtree.
///
/// This mechanism can be used to provide default behavior for scroll views in a
/// subtree inside a modal bottom sheet.
///
/// We want to remove this and use [PrimaryScrollController].
/// This issue should be solved first https://github.com/flutter/flutter/issues/64236
///
/// See [PrimaryScrollController]
class ModalScrollController extends InheritedWidget {
/// Creates a widget that associates a [ScrollController] with a subtree.
ModalScrollController({
Key key,
@required this.controller,
@required Widget child,
}) : assert(controller != null),
super(
key: key,
child: PrimaryScrollController(
controller: controller,
child: child,
),
);
/// The [ScrollController] associated with the subtree.
///
/// See also:
///
/// * [ScrollView.controller], which discusses the purpose of specifying a
/// scroll controller.
final ScrollController controller;
/// Returns the [ScrollController] most closely associated with the given
/// context.
///
/// Returns null if there is no [ScrollController] associated with the given
/// context.
static ScrollController of(BuildContext context) {
final ModalScrollController result =
context.dependOnInheritedWidgetOfExactType<ModalScrollController>();
return result?.controller;
}
@override
bool updateShouldNotify(ModalScrollController oldWidget) =>
controller != oldWidget.controller;
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties.add(DiagnosticsProperty<ScrollController>(
'controller', controller,
ifNull: 'no controller', showName: false));
}
}
... ...
import 'package:flutter/widgets.dart';
/// Creates a primary scroll controller that will
/// scroll to the top when tapped on the status bar
/// Widget that that will scroll to the top the ScrollController
/// when tapped on the status bar
///
class PrimaryScrollStatusBarHandler extends StatefulWidget {
class ScrollToTopStatusBarHandler extends StatefulWidget {
final Widget child;
final ScrollController scrollController;
const PrimaryScrollStatusBarHandler({Key key, this.child}) : super(key: key);
const ScrollToTopStatusBarHandler({
Key key,
@required this.child,
@required this.scrollController,
}) : super(key: key);
@override
_PrimaryScrollWidgetState createState() => _PrimaryScrollWidgetState();
_ScrollToTopStatusBarState createState() => _ScrollToTopStatusBarState();
}
class _PrimaryScrollWidgetState extends State<PrimaryScrollStatusBarHandler> {
class _ScrollToTopStatusBarState extends State<ScrollToTopStatusBarHandler> {
@override
void initState() {
super.initState();
... ... @@ -43,7 +48,7 @@ class _PrimaryScrollWidgetState extends State<PrimaryScrollStatusBarHandler> {
}
void _handleStatusBarTap(BuildContext context) {
final controller = PrimaryScrollController.of(context);
final controller = widget.scrollController;
if (controller != null && controller.hasClients) {
controller.animateTo(
0.0,
... ...