【问题标题】:Error while implementing hero animation in flutter在颤振中实现英雄动画时出错
【发布时间】:2020-08-25 01:32:24
【问题描述】:

所以,我正在尝试制作一个颤动的自行车细节 UI,但我似乎无法让我的英雄动画正常工作。首先,我列出了带有图像的自行车列表,按下时会显示详细信息。我正在尝试在导航到另一个页面时向图像添加英雄动画,但动画不起作用 https://gph.is/g/Z8BQPPz

     Padding(
                  padding: const EdgeInsets.symmetric(
                      horizontal: 10.0, vertical: 6.0),
                  child: GestureDetector(
                        onTap: () {

                          Navigator.push(
                              context,
                              PageRouteBuilder(
                                  pageBuilder: (context, a, b) =>
                                      DetailsOfNewBikes(value: item)));
                        },
                        child: Hero(
                          tag:'item.bikeimage',
                                                      child: Container(
                                decoration: BoxDecoration(
                                  image: DecorationImage(
                                    image: NetworkImage(
                                      item.bikeimage,
                                    ),
                                    fit: BoxFit.cover,
                                    colorFilter: ColorFilter.mode(
                                      Colors.black26,
                                      BlendMode.darken,
                                    ),
                                  ),
                                  borderRadius: BorderRadius.circular(10.0),
                                  color: Colors.grey,
                                ),
                                    ),
                        )))

图片中的下一页我使用了带有相同标签的英雄

                  child: new Column(
                children: <Widget>[
                  Hero(
                    tag:'widget.value.bikeimage',
                                          child: Container(
                                            child: Padding(

                      child: Image.network('${widget.value.bikeimage}'),
                      padding: EdgeInsets.symmetric(horizontal: 0.0),
                    ),
                                          ),
                  ),
                  SizedBox(
                    height: 5,
                  ),
                ],
              ),

【问题讨论】:

  • 使用相同的标签不会解决问题:)

标签: flutter flutter-animation


【解决方案1】:

每个英雄小部件都需要唯一的英雄标签,以便它可以识别您要为哪个小部件设置动画。

 tag:'back',

在这里,您正在向每个小部件提供回馈,因为您正面临这个问题。

注意:确保两个屏幕中的一个英雄标签必须相同,这样当你从第一个屏幕导航到第二个屏幕的小部件时才能找到。 p>

【讨论】:

    【解决方案2】:

    您的英雄动画需要相同的tag

    尝试对两个英雄小部件使用相同的标签。在下面的示例中,我使用了back 标签。

    试试下面的代码,效果很好:

    首屏

        Padding(
                      padding: const EdgeInsets.symmetric(
                          horizontal: 10.0, vertical: 6.0),
                      child: GestureDetector(
                            onTap: () {
    
                              Navigator.push(
                                  context,
                                  PageRouteBuilder(
                                      pageBuilder: (context, a, b) =>
                                          DetailsOfNewBikes(value: item)));
                            },
                            child: Hero(
                              tag:'back',
                                                          child: Container(
                                    decoration: BoxDecoration(
                                      image: DecorationImage(
                                        image: NetworkImage(
                                          item.bikeimage,
                                        ),
                                        fit: BoxFit.cover,
                                        colorFilter: ColorFilter.mode(
                                          Colors.black26,
                                          BlendMode.darken,
                                        ),
                                      ),
                                      borderRadius: BorderRadius.circular(10.0),
                                      color: Colors.grey,
                                    ),
                                        ),
                            )))
    

    第二屏

       child: new Column(
                    children: <Widget>[
                      Hero(
                        tag:'back',
                                              child: Container(
                                                child: Padding(
    
                          child: Image.network('${widget.value.bikeimage}'),
                          padding: EdgeInsets.symmetric(horizontal: 0.0),
                        ),
                                              ),
                      ),
                      SizedBox(
                        height: 5,
                      ),
                    ],
                  ),
    

    要了解有关英雄动画的更多信息,请查看以下链接:

    Hero Animation in Flutter

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      Hero tag 应该是唯一的字符串,但在两个屏幕上共享。

      我相信在您的情况下,您希望将图像 id 作为标签,并且在传递到下一个屏幕时传递相同的 id。 item.bikeimage 或者你知道的东西是 uniq。

      child: Hero(
                            tag: item.id,
                            child: Container(
                                  decoration: BoxDecoration(
                                    image: DecorationImage(
                                      image: NetworkImage(
                                        item.bikeimage,
                                      ),
                                      fit: BoxFit.cover,
                                      colorFilter: ColorFilter.mode(
                                        Colors.black26,
                                        BlendMode.darken,
                                      ),
                                    ),
                                    borderRadius: BorderRadius.circular(10.0),
                                    color: Colors.grey,
                                  ),
                                      ),
                          )))
      
      
          child: new Column(
                  children: <Widget>[
                    Hero(
                      tag: widget.value.id,
                      child: Container(
                              child: Padding(
                        child: Image.network('${widget.value.bikeimage}'),
                        padding: EdgeInsets.symmetric(horizontal: 0.0),
                      ),
                                            ),
                    ),
                    SizedBox(
                      height: 5,
                    ),
                  ],
                ),
      

      【讨论】:

      • 其实有点慢,但是速度很快我可以增加时间吗?
      猜你喜欢
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 2021-01-27
      • 2020-09-02
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多