Home > Mobile >  Scrolling problem with widgets in Flutter
Scrolling problem with widgets in Flutter

Time:07-13

In the gif you can see the problem of the scroll, how can I solve to make the scoll work? I tried to make the scroll unique but with poor results, any changes I make give me a "HasSize" error.

AnnunciBox() is a simple container with text image.

Here is the example GIF: Image

Here is the code:

return Scaffold(
  body: Container(
    padding: const EdgeInsets.all(20),
    child: ScrollConfiguration(
      behavior: CustomScroll(),
      child: CustomScrollView(
        slivers: [
          SliverAppBar(
            titleSpacing: 0,
            backgroundColor: background,
            floating: true,
            pinned: true,
            snap: false,
            centerTitle: false,
            elevation: 0,
            title: Container(
              alignment: Alignment.topLeft,
              padding: const EdgeInsets.only(top: 20, bottom: 20),
              child: const Text(
                'Teso esempio',
                style: TextStyle(
                    fontWeight: FontWeight.w600,
                    fontSize: 28,
                    color: primaryRed,
                    fontFamily: 'Proxima'),
              ),
            ),
            bottom: AppBar(
              titleSpacing: 0,
              elevation: 0,
              backgroundColor: background,
              toolbarHeight: 70,
              title: Row(
                children: [
                  Expanded(
                    child: Container(
                      padding: const EdgeInsets.only(right: 10),
                      child: TextFormField(
                        onTap: () async {
                          // should show search screen here
                          showSearch(
                            context: context,
                            // we haven't created AddressSearch class
                            // this should be extending SearchDelegate
                            delegate: Cerca(),
                          );
                        },
                        decoration: InputDecoration(
                          contentPadding: const EdgeInsets.all(10),
                          enabledBorder: OutlineInputBorder(
                            borderSide: const BorderSide(
                              color: border,
                            ),
                            borderRadius: BorderRadius.circular(10),
                          ),
                          focusedBorder: OutlineInputBorder(
                            borderSide: const BorderSide(
                                width: 1, color: Colors.red),
                            borderRadius: BorderRadius.circular(10),
                          ),
                          labelText: 'Cerca l\'oggetto',
                          prefixIcon: const Icon(Icons.search),
                        ),
                      ),
                    ),
                  ),
                  SizedBox.fromSize(
                    size: const Size(50, 50),
                    child: Material(
                      borderRadius:
                          const BorderRadius.all(Radius.circular(10)),
                      color: primaryRed,
                      child: InkWell(
                        splashColor: secondaryOrange,
                        onTap: () {},
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: const [
                            Image(
                              image: AssetImage(
                                  'assets/images/icon/icon-filter.png'),
                              height: 20,
                            ),
                            Text(
                              "Filtra",
                              style: TextStyle(
                                  fontWeight: FontWeight.w600,
                                  fontSize: 12,
                                  color: Colors.white,
                                  fontFamily: 'Proxima'),
                            ), // <-- Text
                          ],
                        ),
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
          // Other Sliver Widgets
          SliverList(
            delegate: SliverChildListDelegate([
              const SizedBox(
                height: 20,
              ),
              Container(
                decoration: const BoxDecoration(
                  borderRadius: BorderRadius.all(Radius.circular(10)),
                  color: secondaryOrange,
                ),
                height: 200,
              ),
              Container(
                alignment: Alignment.topLeft,
                padding: const EdgeInsets.only(top: 20),
                child: const Text(
                  'Ultimi annunci',
                  style: TextStyle(
                      fontWeight: FontWeight.w500,
                      fontSize: 28,
                      color: Colors.black,
                      fontFamily: 'Proxima'),
                ),
              ),
              SizedBox(
                height: 690,
                child: GridView.count(
                  childAspectRatio: (itemWidth / itemHeight),
                  padding: const EdgeInsets.only(top: 20, bottom: 20),
                  primary: false,
                  crossAxisSpacing: 10,
                  mainAxisSpacing: 10,
                  crossAxisCount: 2,
                  children: const <Widget>[
                    AnnunciBox(colore: primaryRed),
                    AnnunciBox(colore: primaryRed),
                    AnnunciBox(colore: primaryRed),
                    AnnunciBox(colore: primaryRed),
                    AnnunciBox(colore: primaryRed),
                    AnnunciBox(colore: primaryRed),
                  ],
                ),
              ),
              ElevatedButton(
                style: ElevatedButton.styleFrom(
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(10.0),
                  ),
                  primary: Colors.red, // background
                  onPrimary: Colors.white, // foreground
                  minimumSize: const Size(100, 50),
                ),
                onPressed: () {},
                child: const Text(
                  'Carica altri annunci',
                  style: TextStyle(
                      fontWeight: FontWeight.w500,
                      fontSize: 20,
                      color: Colors.white,
                      fontFamily: 'Proxima'),
                ),
              )
            ]),
          ),
        ],
      ),
    ),
  ),
);

CodePudding user response:

you can resolve this issue by passing physics property to your second list like below:

  physics: NeverScrollableScrollPhysics(),

Or you have to use NestedScrollView for this type of usecase

  • Related