質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

231閲覧

SlidingUpPanelでscrollController.jumpTo(0)を実行したあとにパネルを動かせない問題をどう解決するか

Johnny

総合スコア2

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2024/06/10 16:06

編集2024/06/10 16:20

実現したいこと

FlutterでSlidingUpPanelを使った画面を構築しています。
panelが最大化している状態でpanelをダブルタップした時に、panelが最小化するように実装したいです。

しかし、panelを最大化してから、panel内のウィジェットを下スクロールしてからダブルタップすると、panelが最小化したあと、最大化ができず、panel内のウィジェットがスクロールされます。
panel内のウィジェットをスクロールせずにダブルタップをした場合はpanelが正しく動作します。

正しく動作するためにどこを修正すればいいでしょうか。

イメージ説明

該当のソースコード

Dart

1import 'package:flutter/material.dart'; 2import 'package:sliding_up_panel/sliding_up_panel.dart'; 3 4void main() { 5 runApp(const MyApp()); 6} 7 8class MyApp extends StatelessWidget { 9 const MyApp({super.key}); 10 11 12 Widget build(BuildContext context) { 13 return const MaterialApp( 14 title: 'SlidingUpPanelDemo', 15 home: MyHomePage(title: 'SlidingUpPanelDemo'), 16 ); 17 } 18} 19 20class MyHomePage extends StatefulWidget { 21 const MyHomePage({super.key, required this.title}); 22 23 final String title; 24 25 26 State<MyHomePage> createState() => _MyHomePageState(); 27} 28 29class _MyHomePageState extends State<MyHomePage> { 30 PanelController panelController = PanelController(); 31 DateTime lastTapTime = DateTime.now(); 32 33 34 Widget build(BuildContext context) { 35 return Scaffold( 36 body: SlidingUpPanel( 37 controller: panelController, 38 minHeight: MediaQuery.of(context).size.height * 0.45, 39 maxHeight: MediaQuery.of(context).size.height * 0.8, 40 panelBuilder: (ScrollController scrollController) { 41 return Listener( 42 onPointerDown: (event) { 43 final now = DateTime.now(); 44 45 if (now.difference(lastTapTime) < 46 const Duration(milliseconds: 300)) { 47 if (panelController.isPanelOpen) { 48 scrollController.jumpTo(0); 49 panelController.close(); 50 } 51 } 52 lastTapTime = now; 53 }, 54 child: GestureDetector( 55 onDoubleTap: () {}, 56 child: SingleChildScrollView( 57 controller: scrollController, 58 child: Column( 59 children: [ 60 for (int i = 0; i < 6; i++) ...{ 61 Container( 62 height: 200, 63 color: Colors.blue, 64 ), 65 const Divider(color: Colors.grey), 66 } 67 ], 68 ), 69 ), 70 ), 71 ); 72 }, 73 borderRadius: const BorderRadius.only( 74 topLeft: Radius.circular(24.0), 75 topRight: Radius.circular(24.0), 76 ), 77 body: Container( 78 decoration: BoxDecoration( 79 color: Colors.white, 80 borderRadius: BorderRadius.circular(24), 81 ), 82 padding: EdgeInsets.only( 83 bottom: MediaQuery.of(context).size.height * 0.5, 84 ), 85 ), 86 ), 87 ); 88 } 89}

試したこと

SingleChildScrollViewに下記を加えてましたが、やはり正しく動作しませんでした。

Dart

1physics: panelController.isPanelClosed ? const NeverScrollableScrollPhysics() : const AlwaysScrollableScrollPhysics(),

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

たぶん利用側の改良では実現できないと思う。

SlidingUpPanelの中身をざっと見たけど、panelがスクロール可能な場合、ドラッグでスクロールするかそれともパネルの開閉をするかの判断は、内部で持っているフラグで行ってました。

ダブルクリック相当でパネルを閉じて自前のスクロールコントローラーでトップに持って行ってもこのフラグは変更されず、パネル内のドラッグ操作はスクロールするという動作になってしまいます。

_SlidingUpPanelStateの_scrollingEnabledがその変数に当たります。

変更の起点がListenerを使ったイベントのためAPIでどうにかする、ということもできないと思う。


追記
sliding_up_panelは3年前から更新が停止していて、それに不満を持ったと思うユーザーがクローンを作って改訂しているようです。
それがsliding_up_panel2で、そちらであればコードをちょっと修正しないといけないようだけど対応可能なようです。

sliding_up_panelがpanelBuilderからscrollControllerを取得して利用する形になってますが、sliding_up_panel2は事前に用意しておいてSlidingUpPanelに渡す形式になってます。

投稿2024/06/12 08:06

編集2024/06/13 01:50
ta.fu

総合スコア1707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Johnny

2024/06/13 12:50

ご回答いただきありがとうございます。 なるほど、sliding_up_panel2について確認してみます。
Johnny

2024/06/15 12:27

sliding_up_panel2に代替した結果、求めていた動作を実装することができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問