SingleChildScrollView работает неправильно

#flutter #scroll #singlechildscrollview

Вопрос:

Я оборачиваю все тело с помощью SingleChildScrollView, он работает, когда я прокручиваю вниз, но не могу прокрутить вверх.

вот код

 body:SingleChildScrollView(
    scrollDirection: Axis.vertical,
    child: 
    Stack(children: <Widget>[
      calendar(),
      datefilter(),
 
    Container( 
    padding: EdgeInsets.fromLTRB(15, 450, 0, 0),
    child: FutureBuilder( 
    future: _getRecord(),
    builder: (BuildContext context, AsyncSnapshot<List<History>> snapshot) {
      // Check if the data has been received.
      if (snapshot.hasData) {
      
        // Return the widget and provide the received data.
        if(historyList.length!=0){
              return 
                Stack(children:<Widget>[
                Expanded(
                          child: ListView.builder(
                        itemCount:1,
                        scrollDirection: Axis.vertical,
                        shrinkWrap: true,
                        itemBuilder: (BuildContext context, int index) {
                          return ListTile(subtitle:Text("Total Working hours :  " workinghours,style:TextStyle(fontSize: 25,color:Colors.red)));})),


               //here the listtile are building and i used SingleChildScrollView, but it is not working
                 SingleChildScrollView(
                scrollDirection: Axis.vertical,
                child:Expanded(
                          child: ListView.builder(
                        itemCount: snapshot.data.length,
                        scrollDirection: Axis.vertical,
                        shrinkWrap: true,
                        itemBuilder: (BuildContext context, int index) {
                        return Stack(
                              overflow: Overflow.visible,
                              children: <Widget>[
                            ListTile(
                           leading:  CircleAvatar(
                             radius: 25,
                            backgroundColor:Color(int.parse(annualboxcolor)),
                            child: Container(
                              padding: EdgeInsets.fromLTRB(0, 10, 0, 0),
                              child:Column(children: <Widget>[
                              
                              Text(snapshot.data[index].date[1].toString(),style: TextStyle(fontSize: 15.0,fontWeight: FontWeight.bold,color:Colors.white),),  
                            ]
                            
                            ),
                          )),
                          title: Text(snapshot.data[index].date),
                          isThreeLine: true,
                          subtitle:Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                              Text(snapshot.data[index].timeIn " To " snapshot.data[index].timeOut,
                                  ),
                          ],
                      ) 
                      Divider(color: Colors.grey,height: 10,),

                          ]);
                        },
                      )))

              ]);
        }
       
      }

 

Когда я удаляю второй SingleChildScrollView под контейнером, где я использовал future, он тоже не работает в этом случае, и если обернуть контейнер SingleChildScrollView им, он все равно не работает. и если я верну его после этой строки if(historyList.length!=0){ и назову Stack его дочерним, то он все равно не работает.

Обновленный:

 body:SingleChildScrollView(
      scrollDirection: Axis.vertical,
      child: 
    Stack(children: <Widget>[   
      calendar(),
      datefilter(),
    Container(    
    padding: EdgeInsets.fromLTRB(15, 450, 0, 0), 
    child: FutureBuilder(  
    future: _getRecord(), 
    builder: (BuildContext context, AsyncSnapshot<List<History>> snapshot) {
      if (snapshot.hasData) {
        if(historyList.length!=0){
              return  SingleChildScrollView(
                scrollDirection: Axis.vertical,
                child:Stack(children: <Widget>[
                Expanded(
                          child: ListView.builder(
                        itemCount:1,
                        scrollDirection: Axis.vertical,
                        shrinkWrap: true,
                        itemBuilder: (BuildContext context, int index) {
                          return ListTile(subtitle:Text("Total Working hours :  " workinghours,style:TextStyle(fontSize: 25,color:Colors.red)));})),
                  Padding(padding: EdgeInsets.fromLTRB(0, 70, 0, 0),
                child:Expanded(
                          child: ListView.builder(
                        itemCount: snapshot.data.length,
                        scrollDirection: Axis.vertical,
                        shrinkWrap: true,
                        itemBuilder: (BuildContext context, int index) {
                        return SingleChildScrollView(
                              //overflow: Overflow.visible,
                              child:Stack(
                                overflow: Overflow.visible,
                                children:<Widget>[
                            ListTile(
                           leading:  CircleAvatar(
                             radius: 25,
                            backgroundColor:Color(int.parse(annualboxcolor)),
                            child: Container(
                              padding: EdgeInsets.fromLTRB(0, 10, 0, 0),
                              child:Column(children: <Widget>[
                              Text(snapshot.data[index].date[9].toString(),style: TextStyle(fontSize: 15.0,fontWeight: FontWeight.bold,color:Colors.white),),  
                            ]
                            
                            ),
                          )),
                          title: Text(snapshot.data[index].date),
                          isThreeLine: true,
                          subtitle:Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                              Text(snapshot.data[index].timeIn " To " snapshot.data[index].timeOut,),
                          ],
                      )
                          ),
                          Divider(color: Colors.grey,height: 10,),
                          ]));
                        },
                      )))

              ]));
        }
       
      }
 

Когда я заменяю Stack на Column в основном SingleChildScrollView , он не отображает calender() вывод виджета, вот почему я использую Stack .

И это говорит о том, что я использовал неправильное использование Неправильного использования ParentDataWidget. вот журналы

 ════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown while applying parent data.:
Incorrect use of ParentDataWidget.

The ParentDataWidget Expanded(flex: 1) wants to apply ParentData of type FlexParentData to a RenderObject, which has been set up to accept ParentData of incompatible type StackParentData.

Usually, this means that the Expanded widget has the wrong ancestor RenderObjectWidget. Typically, Expanded widgets are placed directly inside Flex widgets.
The offending Expanded is currently placed inside a Stack widget.

The ownership chain for the RenderObject that received the incompatible parent data was:
  RepaintBoundary ← NotificationListener<ScrollNotification> ← GlowingOverscrollIndicator ← Scrollable ← ListView ← Expanded ← Stack ← _SingleChildViewport ← IgnorePointer-[GlobalKey#c7d81] ← Semantics ← ⋯
When the exception was thrown, this was the stack
════════ Exception caught by widgets library ═══════════════════════════════════
Incorrect use of ParentDataWidget.
 

пожалуйста, помогите, как это исправить.

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

1. добавьте neverscrollphysic() в основной Singlechildscrollview также используйте столбец вместо стека и удалите singlechildscrollview из списка и в зависимости от использования flex:0,flex:1 в расширенный виджет,если ни один из них не работает,покажите какой-то дизайн, я помогу вам дать некоторые наброски

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

Ответ №1:

Если ваши виджеты календаря и фильтра даты являются константами, я имею в виду, что они не прокручиваются, поэтому попробуйте удалить оба ваших вида SingleChildScrollView и используйте приведенный ниже код, надеюсь, это будет полезно для вас, объявите свои виджеты внутри столбца, а не стека

 body:Column:(
  children [ 
    calendar (),
     datefilter (),
     Expanded:(
      child:FutureBuilder(),
      )
    ],
   ),
 

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

1. сейчас я получаю ошибку переполнения renderflex

2. Хорошо, попробуйте добавить виджет столбца в SingleChildScrollView

3. это все еще не работает, я обновил свой вопрос с ответом на ваш вопрос, пожалуйста, проверьте