Как поместить вид прокрутки внутри виджета стека в flutter

#flutter

#flutter

Вопрос:

Я создаю приложение flutter, в котором я использую body в качестве стека, и в этом стеке у меня есть два дочерних элемента.Один — основной корпус, а другой — кнопка возврата, которая находится в верхней части экрана.Первым дочерним элементом стека является scrollview.Вот мой метод сборки.

   Widget build(BuildContext context) {

    return Scaffold(
      //debugShowCheckedModeBanner: false,
      key: scaffoldKey,
      backgroundColor: Color(0xFF5E68A6),

        body: Stack(
          children: <Widget>[
            Container(
              margin: const EdgeInsets.fromLTRB(0.0, 10.0  , 0.0 , 0.0 ),
              height: double.infinity,
              child:CustomScrollView(
                slivers: <Widget>[

                  new Container(
                    margin: EdgeInsets.all(15.0),
                    child:Text(getTitle(),
                      style: TextStyle(fontSize: 20.0,fontWeight: FontWeight.bold,color: Colors.white),
                    ),
                  ),


                  //middle section
                  _isLoading == false ?
                  new Expanded(child:  GridView.builder(
                      itemCount: sub_categories_list.length,
                      physics: const NeverScrollableScrollPhysics(),
                      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
                      itemBuilder: (context, position){
                        return InkWell(
                          child: new Container(
                            //color: Colors.white,
                            padding: EdgeInsets.all(20),
                            margin: EdgeInsets.all(10),
                            height: 130,
                            width: 130,
                            child: new Center(
                                child :
                                Text(sub_categories_list[position].name,
                                  style: TextStyle(fontSize: 18.0,fontWeight: FontWeight.bold),
                                )
                            ),
                            decoration: BoxDecoration(
                              color: Colors.white,
                              borderRadius: BorderRadius.all(Radius.circular(16)),

// border: Border.all(color: Colors.black, width: 3),
                            ),
                          ),
                          onTap: () {
                            //write here
                            // Fluttertoast.showToast(msg: "You clicked id :" sub_categories_list[position].cat_id.toString());
                            Navigator.pushNamed(context, '/advicemyself');


                          },
                        );

                      }

                  ))
                      :
                  CircularProgressIndicator(),


                  Container(

                    margin: EdgeInsets.all(18.0),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      mainAxisSize: MainAxisSize.max,
                      children: <Widget>[

                        new Column(

                          children: <Widget>[
                            Image.asset('assets/bt1.png'),
                            Container(
                              margin: EdgeInsets.all(10.0),
                              child: Text("FIND HELP",
                                style: TextStyle(fontSize: 18.0,color: Colors.white),
                              ),
                            )
                          ],
                        ),
                        new Column(

                          children: <Widget>[
                            Image.asset('assets/bt2.png'),
                            Container(
                              margin: EdgeInsets.all(10.0),
                              child: Text("HOME",
                                style: TextStyle(fontSize: 18.0,color: Colors.white),
                              ),
                            )
                          ],
                        ),
                        new Column(
                          mainAxisAlignment:MainAxisAlignment.spaceEvenly,
                          children: <Widget>[

                            Image.asset('assets/bt3.png'),
                            Container(
                              margin: EdgeInsets.all(10.0),
                              child: Text("CALL 999",
                                style: TextStyle(fontSize: 18.0,color: Colors.white),
                              ),
                            )

                          ],
                        ),

                      ],
                    ),

                  ),
                ],
                      ),
            ),

            Positioned(
              left: 10,
              top: 30,
              child: IconButton(
                icon: Icon(Icons.arrow_back),
                onPressed: () => {
               //go back

                },
                color: Colors.white,
                iconSize: 30,
              ),
            ),
            //                                                                                                                makeview()
          ],
        ),
      // This trailing comma makes auto-formatting nicer for build methods.
    );
       }

  

Я также пробовал использовать SingleChildScrollView, но это также не работает.Что я здесь делаю не так?
Вот ссылка на дизайн, который я хочу сделать.

https://imgur.com/a/w7nLmKC

Обратная сторона должна быть выше вида прокрутки, поэтому я использовал виджет стека.

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

1. Я могу напрямую запустить ваш код, можете ли вы объяснить, что происходит, когда вы размещаете вид прокрутки внутри стека. И я не вижу никаких причин использовать виджет стека, посмотрев на предоставленный вами пример изображения.

2. можете ли вы сказать мне, как сделать макет как на изображении без стека

3. Просто используйте каркас с этим цветом фона (таким образом, вы можете использовать AppBar с прозрачным цветом фона и высотой: 0.0), а для кругов используйте gridview с контейнерами для хранения вашего текста.

Ответ №1:

При запуске вашего примера кода, похоже, нет необходимости в перекрывающихся виджетах. Использование Stack кажется ненужным. Один из способов, который вы могли бы сделать, это использовать Column виджет и использовать Expanded так, как вы считаете нужным.

 Widget build(BuildContext context) {
  return Scaffold(
    body: Column(
      children: [
        Widget(), // back button goes here
        CustomScrollView(...),
      ],
    ),
  );
}
  

В противном случае, если вам действительно нужно использовать Stack, функция прокрутки должна работать нормально. Я пробовал это локально, и виджет Stack не мешает прокрутке Slivers, ListView и GridView.

 Stack(
  children: [
    /// Can be GridView, Slivers
    ListView.builder(),
    /// Back button
    Container(),
  ],
),