teratail header banner
teratail header banner
質問するログイン新規登録
Flutter

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

Dart

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

Q&A

解決済

1回答

632閲覧

Androidでもスワイプで戻る処理を実現したい

rdt

総合スコア14

Flutter

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

Dart

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

0グッド

0クリップ

投稿2023/09/27 07:39

編集2023/09/27 14:01

0

0

実現したいこと

Androidでもスワイプで戻る処理を実現したい

前提

Flutterで以下のような実装をしました。
iOSでは、画面左側をスワイプをすると、Page2からPage1に戻ることができます。

どのように実装すれば、AndroidでもiOSと同様に、スワイプで戻る処理を実現できるでしょうか?

試したこと

cupertino_back_gestureを使用して、iOSではスワイプで戻る処理を実現できました。
しかし、AndroidではiOSと同様の動作が行われません。
https://pub.dev/packages/cupertino_back_gesture

該当のソースコード

Dart

1import 'package:flutter/material.dart'; 2import 'package:cupertino_back_gesture/cupertino_back_gesture.dart'; 3 4void main() { 5 runApp(MyApp()); 6} 7 8class MyApp extends StatelessWidget { 9 const MyApp({super.key}); 10 11 12 Widget build(BuildContext context) { 13 return BackGestureWidthTheme( 14 backGestureWidth: BackGestureWidth.fraction(0.5), 15 child: MaterialApp( 16 theme: ThemeData( 17 pageTransitionsTheme: const PageTransitionsTheme( 18 builders: { 19 TargetPlatform.android: 20 CupertinoPageTransitionsBuilderCustomBackGestureWidth(), 21 TargetPlatform.iOS: 22 CupertinoPageTransitionsBuilderCustomBackGestureWidth(), 23 }, 24 ), 25 ), 26 home: DefaultTabController( 27 length: 3, 28 child: Scaffold( 29 appBar: AppBar( 30 title: const Text('Pages'), 31 bottom: const TabBar( 32 tabs: [ 33 Tab(text: 'TabA'), 34 Tab(text: 'TabB'), 35 Tab(text: 'TabC'), 36 ], 37 ), 38 ), 39 body: TabBarView( 40 children: [ 41 Navigator( 42 onGenerateRoute: (_) => MaterialPageRoute( 43 builder: (_) => Page1(), 44 ), 45 ), 46 const Center( 47 child: Text('TabB'), 48 ), 49 const Center( 50 child: Text('TabC'), 51 ), 52 ], 53 ), 54 ), 55 ), 56 ), 57 ); 58 } 59} 60 61class Page1 extends StatelessWidget { 62 const Page1({super.key}); 63 64 65 Widget build(BuildContext context) { 66 return Scaffold( 67 body: Center( 68 child: Column( 69 mainAxisAlignment: MainAxisAlignment.center, 70 children: [ 71 const Text('Page1'), 72 const SizedBox(height: 10), 73 ElevatedButton( 74 onPressed: () { 75 Navigator.of(context).push( 76 MaterialPageRoute( 77 builder: (context) => Page2(), 78 ), 79 ); 80 }, 81 child: const Text('Go to Page2'), 82 ), 83 ], 84 ), 85 ), 86 ); 87 } 88} 89 90class Page2 extends StatelessWidget { 91 const Page2({super.key}); 92 93 94 Widget build(BuildContext context) { 95 return Scaffold( 96 appBar: AppBar( 97 title: const Text('Page2'), 98 ), 99 body: const Center( 100 child: Text('Page2'), 101 ), 102 ); 103 } 104}

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

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

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

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

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

guest

回答1

0

ベストアンサー

画面の構造が変わっちゃうけど、Page1の上のNavigatorを取っ払うしかないのかな。

dart

1 children: [ 2 Navigator( 3 onGenerateRoute: (_) => MaterialPageRoute( 4 builder: (_) => Page1(), 5 ), 6 ),

この部分を以下の様な感じに。

dart

1 children: [ 2 Page1(),

iOSでうまくいく理由は不明だけど、Android版を見ると左から右のジェスチャーが、TabBarViewのとpop用の2つで競合しTabBarView側のが勝ってしまっている。なのでpop用のジェスチャー動作が動かない結果になってるみたい。
どちらのジェスチャー処理も内部実装の物を使っているようなので、そちらを変更するのは難しいのではと思う。
現状の解決策としては、ジェスチャー動作が競合しないように、TabBarView内にページがpushされて表示されないようにするしかないと思われます。

なおジェスチャーの競合状態はrunAppの前にdebugPrintGestureArenaDiagnostics = true;を置くと見ることができます。

投稿2023/09/29 10:08

ta.fu

総合スコア1749

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

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

rdt

2023/10/02 05:38

ご回答ありがとうございます。 難しそうですね、、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問