Próbuję pokazać niektóre dane z sqlite i wszystko jest w porządku, ale nie mogę użyć StreamBuilder wewnątrz CustomScrollView, mówi:

RenderViewport oczekiwał elementu podrzędnego typu RenderSliver, ale otrzymał element podrzędny typu RenderPositionedBox.

Następnie zawinąłem StreamBuilder za pomocą SliverPadding (normalnie SliverPadding był opakowany przez StreamBuilder), ale tym razem mówi:

Element RenderSliverPadding oczekiwał elementu podrzędnego typu RenderSliver, ale otrzymał element podrzędny typu RenderPositionedBox.

Próbowałem użyć SliverToBoxAdapter i opakowałem StreamBuilder z tym, ale nie rozwiązałem mojego problemu, więc jak mogę to osiągnąć?

Oto ostatni status mojego kodu:

CustomScrollView(
  slivers: <Widget>[
    SliverAppBar(
      centerTitle: true,
      floating: false,
      snap: false,
      pinned: false,
      expandedHeight: 0,
      elevation: 3,
      forceElevated: true,
      backgroundColor: Theme.of(context).scaffoldBackgroundColor,
      brightness: Brightness.light,
      title: Text(
        'Your Lists',
        style: GoogleFonts.openSans(
            fontSize: 22, fontWeight: FontWeight.bold, color: Colors.black),
      ),
    ),
    SliverPadding(
      padding: EdgeInsets.fromLTRB(16, 16, 16, 74),
      sliver: StreamBuilder<List<Category>>(
          stream: bloc.getAll().asStream(),
          builder: (context, AsyncSnapshot<List<Category>> snapshot) {
            if (snapshot.hasData) {
              return SliverGrid(
                delegate: SliverChildBuilderDelegate(
                    (BuildContext context, int index) {
                  if (index == snapshot.data.length) {
                    return ListAddCard();
                  }
                  return ListCard(
                    category: snapshot.data[index],
                  );
                }, childCount: snapshot.data.length + 1),
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                    crossAxisCount: 2,
                    mainAxisSpacing: 16,
                    crossAxisSpacing: 16,
                    childAspectRatio: 1.1),
              );
            }
            return Center(child: CircularProgressIndicator());
          }),
    )
  ],
);
0
WildHunter 31 sierpień 2020, 11:38

2 odpowiedzi

Najlepsza odpowiedź

Rozwiązaniem tego problemu jest zawijanie całego CustomScrollView wewnątrz Streambuilder, a nie odwrotnie. Miałem ten sam problem, dopóki nie zastosowałem tej strategii.

0
Aurangzaib Ahmed Siddiqui 6 wrzesień 2020, 17:52

Problem polega na tym, że SliverPadding oczekuje RenderSliverPadding, ale dajesz mu RenderPositionedBox. Zamiast tego możesz usunąć SliverPadding i zawinąć go w SliverGrid zamiast w StreamBuilder.
Spróbuj tego:

StreamBuilder<List<Category>>(
          stream: bloc.getAll().asStream(),
          builder: (context, AsyncSnapshot<List<Category>> snapshot) {
            if (snapshot.hasData) {
              return  SliverPadding(
      padding: EdgeInsets.fromLTRB(16, 16, 16, 74),
      sliver: SliverGrid(
                delegate: SliverChildBuilderDelegate(
                    (BuildContext context, int index) {
                  if (index == snapshot.data.length) {
                    return ListAddCard();
                  }
                  return ListCard(
                    category: snapshot.data[index],
                  );
                }, childCount: snapshot.data.length + 1),
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                    crossAxisCount: 2,
                    mainAxisSpacing: 16,
                    crossAxisSpacing: 16,
                    childAspectRatio: 1.1),),
              );
            }
            return Center(child: CircularProgressIndicator());
          }),
0
Uni 31 sierpień 2020, 08:55