現状・問題点
現在FlutterでiPad専用のアプリケーションを開発しています。
UIはiPadの設定アプリのようなものを作成したいと思っているのですが、うまくいっていないので質問させていただきます。
iPadの設定アプリのUIはこちらです。
このように左側にサイドバーがあり、右側にその内容を表示するというところまでは出来ているのですが(画像)、右側でNavigator.of.push
を用いた遷移を行うと、サイドバーの上に遷移先の画面が覆いかぶさってしまってしまいます(画像)。
サイドバーを固定したままで遷移させたいのですが、やり方を知っている方がいたら教えていただきたいです????????♂️
コード
lib/main.dart
dart
1import 'package:flutter/material.dart'; 2import 'package:health_check/ui/master_detail_container.dart'; 3 4void main() => runApp(MyAppScreen()); 5 6class MyAppScreen extends StatefulWidget { 7 8 _MyAppScreenState createState() => _MyAppScreenState(); 9} 10 11class _MyAppScreenState extends State<MyAppScreen> { 12 13 Widget build(BuildContext context) { 14 return MaterialApp( 15 home: MasterDetailContainer(), 16 ); 17 } 18}
lib/ui/master_detail_container.dart
dart
1import 'package:flutter/material.dart'; 2import 'package:health_check/ui/item.dart'; 3import 'package:health_check/ui/item_details.dart'; 4import 'package:health_check/ui/item_listing.dart'; 5 6class MasterDetailContainer extends StatefulWidget { 7 8 _ItemMasterDetailContainerState createState() => 9 _ItemMasterDetailContainerState(); 10} 11 12class _ItemMasterDetailContainerState extends State<MasterDetailContainer> { 13 Item _selectedItem; 14 15 Widget _sideBar() { 16 return Flexible( 17 flex: 1, 18 child: Material( 19 elevation: 4.0, 20 child: ItemListing( 21 itemSelectedCallback: (item) { 22 setState(() { 23 _selectedItem = item; 24 }); 25 }, 26 selectedItem: _selectedItem, 27 ), 28 ), 29 ); 30 } 31 32 Widget _itemContent() { 33 return Flexible( 34 flex: 3, 35 child: ItemDetails( 36 item: _selectedItem, 37 ), 38 ); 39 40 } 41 42 43 Widget build(BuildContext context) { 44 return Scaffold( 45 body: Row( 46 children: <Widget>[ 47 _sideBar(), 48 _itemContent(), 49 ], 50 ), 51 ); 52 } 53}
lib/ui/item_listing.dart
dart
1import 'package:flutter/material.dart'; 2import 'package:health_check/ui/item.dart'; 3import 'package:health_check/ui/item_details.dart'; 4 5class ItemListing extends StatelessWidget { 6 ItemListing({ 7 this.itemSelectedCallback, 8 this.selectedItem, 9 }); 10 11 final ValueChanged<Item> itemSelectedCallback; 12 final Item selectedItem; 13 14 15 Widget build(BuildContext context) { 16 // return 17 return ListView( 18 children: items.map((item) { 19 return ListTile( 20 title: Text(item.title), 21 onTap: () => itemSelectedCallback(item), 22 selected: selectedItem == item, 23 ); 24 }).toList(), 25 ); 26 } 27}
lib/ui/item_details.dart
dart
1import 'package:flutter/material.dart'; 2import 'package:health_check/ui/item.dart'; 3import 'package:health_check/ui/item1_screen.dart'; 4import 'package:meta/meta.dart'; 5 6class ItemDetails extends StatelessWidget { 7 ItemDetails({ 8 this.item, 9 }); 10 11 final Item item; 12 13 14 Widget build(BuildContext context) { 15 final TextTheme textTheme = Theme.of(context).textTheme; 16 17 final Widget content = Column( 18 mainAxisAlignment: MainAxisAlignment.center, 19 children: [ 20 RaisedButton( 21 child: Text("Button"), 22 color: Colors.orange, 23 textColor: Colors.white, 24 onPressed: () { 25 Navigator.of(context, rootNavigator: true).push( 26 MaterialPageRoute(builder: (context) => Item1Screen())); 27 }, 28 ), 29 Text( 30 item?.title ?? 'No item selected!', 31 style: textTheme.headline, 32 ), 33 Text( 34 item?.subtitle ?? 'Please select one on the left.', 35 style: textTheme.subhead, 36 ), 37 ], 38 ); 39 40 return Scaffold( 41 appBar: AppBar( 42 title: Text('Appbar'), 43 ), 44 body: Center(child: content), 45 ); 46 } 47}
lib/ui/item1_screen.dart
dart
1import 'package:flutter/material.dart'; 2 3class Item1Screen extends StatelessWidget { 4 Item1Screen(); 5 6 7 8 Widget build(BuildContext context){ 9 return Scaffold( 10 appBar: AppBar( 11 title: Text('Item1 detail'), 12 ), 13 body: Center() 14 ); 15 } 16}
lib/ui/item.dart
dart
1import 'package:meta/meta.dart'; 2 3class Item { 4 Item({ 5 this.title, 6 this.subtitle, 7 }); 8 9 final String title; 10 final String subtitle; 11} 12 13final List<Item> items = <Item>[ 14 Item( 15 title: 'Item 1', 16 subtitle: 'This is the first item.', 17 ), 18 Item( 19 title: 'Item 2', 20 subtitle: 'This is the second item.', 21 ), 22 Item( 23 title: 'Item 3', 24 subtitle: 'This is the third item.', 25 ), 26];
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。