0

I am trying to make a animation show bookmark. Just like the example on this website.The orignial example is too complicated. So I put part of code from the example of flutter doc. To learn the easiest animation. I have put same tag in both hero,but still error.

Please help me out.Thanks!

Sorry my english is poor.

Center(
    child: FutureBuilder(
      future: fetchData('querySdiList'),
      builder: (context, qS) {
        if (qS.hasData) {
          return CarouselSlider.builder(
            itemCount: qS.data.length,
            itemBuilder: (BuildContext context, int itemIndex, int i) {
              final list = qS.data[itemIndex];
              sdiId = list['sdiId'];
              print('carousel:' + sdiId.toString());
              return Center(
                  child: SizedBox(
                      width: 300,
                      child: Hero(
                          tag: sdiId.toString(),
                          child: Material(
                            child: InkWell(
                              onTap: () {
                                // Navigator.pushNamed(context, '/BookMarkPage');

                                Navigator.of(context).push(
                                    MaterialPageRoute<void>(
                                        builder: (BuildContext context) {
                                  print('Hero:' + sdiId.toString());
                                  return Container(
                                      // Set background to blue to emphasize that it's a new route.
                                      color: Colors.lightBlueAccent,
                                      padding: const EdgeInsets.all(16.0),
                                      alignment: Alignment.topLeft,
                                      child: SizedBox(
                                        width: 100,
                                        child: Hero(
                                          tag: sdiId.toString(),
                                          child: Material(
                                            color: Colors.transparent,
                                            child: InkWell(
                                              onTap: () {},
                                              child: Image.network(
                                                _image[0],
                                                fit: BoxFit.contain,
                                              ),
                                            ),
                                          ),
                                        ),
                                      ));
                                }));
                              },
                              child: Container(
                                height:
                                    MediaQuery.of(context).size.height / 2,
                                decoration: BoxDecoration(
                                  boxShadow: [
                                    BoxShadow(
                                      offset: Offset(0, 10),
                                      color: Colors.grey.withOpacity(0.5),
                                      spreadRadius: 5,
                                      blurRadius: 10,
                                    )
                                  ],
                                ),
                                margin: EdgeInsets.all(5.0),
                                child: Stack(
                                  alignment: Alignment.bottomLeft,
                                  children: <Widget>[
                                    ClipRRect(
                                      borderRadius: BorderRadius.all(
                                          Radius.circular(15)),
                                      child: Container(
                                        height: MediaQuery.of(context)
                                                .size
                                                .height /
                                            2,
                                        decoration: BoxDecoration(
                                          image: DecorationImage(
                                              fit: BoxFit.cover,
                                              image: NetworkImage(_image[
                                                  Random().nextInt(
                                                      _image.length)])),
                                        ),
                                      ),
                                    ),
                                    Container(
                                      height: MediaQuery.of(context)
                                          .size
                                          .height,
                                      decoration: BoxDecoration(
                                        borderRadius: BorderRadius.all(
                                            Radius.circular(15)),
                                        color: Colors.white,
                                        gradient: LinearGradient(
                                          begin: FractionalOffset.topCenter,
                                          end: FractionalOffset.bottomLeft,
                                          colors: [
                                            Colors.transparent,
                                            Colors.black,
                                          ],
                                          stops: [0.0, .85],
                                        ),
                                      ),
                                    ),
                                    Container(
                                      padding: EdgeInsets.all(10),
                                      child: RichText(
                                        text: TextSpan(
                                          text: '${list['sdiName']}',
                                          style: TextStyle(
                                              fontSize: 50,
                                              color: Colors.white),
                                        ),
                                      ),
                                      height: MediaQuery.of(context)
                                              .size
                                              .height /
                                          8,
                                    ),
                                  ],
                                ),
                              ),
                            ),
                          ))));
            },
            options: CarouselOptions(
              aspectRatio: 2,
              autoPlay: true,
              enlargeCenterPage: true,
              height: MediaQuery.of(context).size.height,
            ),
          );
        } else if (qS.hasError) {
          return qS.error;
        }
        return CircularProgressIndicator();
      },
    ),
  ),

error

There are multiple heroes that share the same tag within a subtree.
Memba
  • 1
  • 2

1 Answers1

0

You are creating multiple widgets with the carouselBuilder and each one of them is getting the same tag, you cant do that, the tag is what tells the Hero widget where it should animate to.

The problem seem to be here

      final list = qS.data[itemIndex];
      sdiId = list['sdiId'];

try setting the hero tag as something like this

tag: qS.data[itemIndex]['sdiId']

this should give each of the heros the sdiId of the itemIndex preventing them from having the same one

Jaime Ortiz
  • 1,089
  • 10
  • 14