Как разделить экран на 2 столбца по вертикали и применить прокрутку на всю страницу?

#flutter #flutter-layout

Вопрос:

введите описание изображения здесь У меня возникла небольшая проблема с разделением экрана на 2 секции по вертикали, а затем обертыванием всей страницы буквой SingleChildScrollView А. Если ConstrainedBox столбцы не будут отображаться, есть ли какой-либо другой способ сделать это?, возникнут ли какие-либо проблемы с производительностью при использовании MediaQuery.of(context).size.height - AppBar().preferredSize.height для обертывания обоих разделов в ограниченном поле для расширения до высоты всего экрана?

 body: RefreshIndicator(  onRefresh: () async{  print('testing');  }, child: SingleChildScrollView(  physics: const BouncingScrollPhysics(  parent: AlwaysScrollableScrollPhysics()),  child: ConstrainedBox(  constraints: BoxConstraints(maxHeight: MediaQuery.of(context).size.height -  AppBar().preferredSize.height), //----------gt; I want to avoid using BoxConstraints  child: Padding(  padding: const EdgeInsets.only(left: 24.0, right: 24.0, top: 24.0),  child: Column(  mainAxisSize: MainAxisSize.min,  children: [  Container(  // flex: 1,  child: Container(  color: Colors.amber,  // height: 20 * SizeConfig.heightMultiplier,  child: Column(  mainAxisAlignment: MainAxisAlignment.start,  crossAxisAlignment: CrossAxisAlignment.stretch,  children: [  Container(  // height: 100.0,  // width: 100.0,  child: Text('teacher_photo_album_flow.listing_title'.tr(),  style: CustomTextStyle.pageSectionTitle(context),),  ),  SizedBox(  height: 2 * SizeConfig.heightMultiplier,  ),  GestureDetector(  onTap: (){    },  child: Container(  child: Column(children: [  Container(  height: 25 * SizeConfig.heightMultiplier,  // width: double.infinity,  width: double.infinity,  child: ClipRRect(  borderRadius: BorderRadius.circular(8.0),  child: Image.network(this.photoAlbums1[0]['album_cover'],  fit: BoxFit.cover,  width: MediaQuery.of(context).size.width,  ),  ),  ),  SizedBox(  height: 1.5 * SizeConfig.heightMultiplier,  ),  Row(  mainAxisAlignment: MainAxisAlignment.spaceBetween,  children: [  Expanded(  flex: 4,  child:   Container(  alignment: Alignment.centerLeft,  child: Text(this.photoAlbums1[0]['title'],  style: CustomTextStyle.titleOnelineEllipses(context),),  ),  ),  Expanded(  // flex: 1,  child:   Container(  alignment: Alignment.centerRight,  child: Text(this.photoAlbums1[0]['newDate'],  style: CustomTextStyle.silentTextDate(context),),  )  ,),  ],  ),  ],),  )  ),  SizedBox(  height: 3 * SizeConfig.heightMultiplier,  ),  ],  ),  ),  ),  photoAlbums2.length gt; 0 ? Expanded(  // flex: 2,  child: Container(  child: Column(  children: [   Expanded(  // flex: 2,  child: GridView.builder(  shrinkWrap: true,  primary: true,  physics: NeverScrollableScrollPhysics(),  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(  crossAxisSpacing: 1,  mainAxisSpacing: 1,  crossAxisCount: 2),  itemCount: this.photoAlbums2.length,  itemBuilder: (BuildContext ctx, i) {    return   GestureDetector(  onTap: (){   },  child: Container(   child: Column(children: [  Container(  height: 15 * SizeConfig.heightMultiplier,  // width: double.infinity,  width: double.infinity,  child: ClipRRect(  borderRadius: BorderRadius.circular(8.0),  child: Image.network(this.photoAlbums2[i]['album_cover'],  fit: BoxFit.cover,  width: MediaQuery.of(context).size.width,  ),  ),  ),  SizedBox(  height: 1.0 * SizeConfig.heightMultiplier,  ),  Container(  alignment: Alignment.centerLeft,  child: Text(this.photoAlbums2[i]['title'],  style: CustomTextStyle.titleOnelineEllipses(context),),  ),  SizedBox(  height: 0.5 * SizeConfig.heightMultiplier,  ),  Container(  alignment: Alignment.centerLeft,  child: Text(this.photoAlbums2[i]['newDate'],  style: CustomTextStyle.silentTextDate(context),),  ),  ],),  )  );    }    ),  ),]  ),  ),  ) : SizedBox(height: 0,)  ],),  ),  ), ), );  

Комментарии:

1. Вам нравится SingleChildScrollView , чтобы на теле прокручивалась, значит, верхняя коробка также будет перемещаться на основе прокрутки основного корпуса?

2. @YeasinSheikh Да, правильно, я хочу, чтобы прокручивалась вся страница. Поэтому я отключил прокрутку в physics: NeverScrollableScrollPhysics() своем представлении сетки, и моя единственная проблема заключается в том, что без ConstrainedBox указанной высоты вся страница не будет отображаться

Ответ №1:

Я использую LayoutBuilder , чтобы получить размер экрана.

 @override  Widget build(BuildContext context) {  return Scaffold(  body: LayoutBuilder(builder: (context, constraints) {  return RefreshIndicator(  onRefresh: () async {},  child: CustomScrollView(slivers: [  SliverToBoxAdapter(  child: Container(  color: Colors.green,  width: constraints.maxWidth,  height: constraints.maxHeight * .3,// amount of height you want or the widget you like to include with `ConstrainedBox`  ),  ),  SliverGrid.count(  crossAxisCount: 2,  children: [  ...List.generate(  11,  (index) =gt; Container(  color: index % 3 == 0 ? Colors.amber : Colors.cyanAccent,  ),  )  ],  ),  ]));  }),  );  }  

Комментарии:

1. Спасибо, я делаю что-то подобное с ConstrainedBox передачей высоты и вычетом высоты панели maxHeight: MediaQuery.of(context).size.height - AppBar().preferredSize.height приложений, думал, есть ли лучшие способы сделать это, вместо явной передачи высоты

Ответ №2:

попробуйте это

 SingleChildScrollView(  child: Column(  mainAxisSize: MainAxisSize.min,  mainAxisAlignment: MainAxisAlignment.start,  crossAxisAlignment: CrossAxisAlignment.stretch,  children: [  Container(  child: Padding(  padding: EdgeInsets.all(20),  child: Text(''),  ),  color: Colors.red,  ),  SizedBox(  height: 10,  ),  Row(  mainAxisSize: MainAxisSize.min,  mainAxisAlignment: MainAxisAlignment.spaceBetween,  crossAxisAlignment: CrossAxisAlignment.start,  children: [  Expanded(  child: Container(    color: Colors.yellow,  child : Padding(  padding: EdgeInsets.all(20),),  ),  ),  SizedBox(width : 10,),  Expanded(  child: Container(     color: Colors.yellow,  child : Padding(  padding: EdgeInsets.all(20),),  ),  ),  ],  ),    SizedBox(height : 10),  Row(  mainAxisSize: MainAxisSize.min,  mainAxisAlignment: MainAxisAlignment.spaceBetween,  crossAxisAlignment: CrossAxisAlignment.start,  children: [  Expanded(  child: Container(    color: Colors.yellow,  child : Padding(  padding: EdgeInsets.all(20),),  ),  ),  SizedBox(width : 10,),  Expanded(  child: Container(     color: Colors.yellow,  child : Padding(  padding: EdgeInsets.all(20),),  ),  ),  ],  ),  SizedBox(height : 10),  Row(  mainAxisSize: MainAxisSize.min,  mainAxisAlignment: MainAxisAlignment.spaceBetween,  crossAxisAlignment: CrossAxisAlignment.start,  children: [  Expanded(  child: Container(    color: Colors.yellow,  child : Padding(  padding: EdgeInsets.all(20),),  ),  ),  SizedBox(width : 10,),  Expanded(  child: Container(     color: Colors.yellow,  child : Padding(  padding: EdgeInsets.all(20),),  ),  ),  ],  ),  ]),  )