Flutter - 来自 Firebase 的英雄小部件子图像 url

Posted

技术标签:

【中文标题】Flutter - 来自 Firebase 的英雄小部件子图像 url【英文标题】:Flutter - Hero widget child Image url from Firebase 【发布时间】:2021-04-08 22:10:36 【问题描述】:

我正在尝试创建一个具有子 Image.network() 的 Hero 小部件

Hero(
 tag: 'headerView',
 transitionOnUserGestures: true,
 child: Image.network(
   headerPhoto,
   fit: BoxFit.cover,
 ),
)

图片 url -headerPhoto- 是从 Firestore 异步获取的,因此,我假设我必须将此 Hero 小部件放在 FutureBuilder 中。

FutureBuilder(
  builder: (context, snapshot) 
  ...
    if (snapshot.connectionState == ConnectionState.done) 
      if (snapshot.hasData) 
        String headerPhoto = snapshot.data['headerPhoto'];
        return Scaffold(
          body:GestureDetector(
            onTap: () 
              _showPage('headerView', headerPhoto);
            ,
            child: Hero(
              tag: 'headerView',
              transitionOnUserGestures: true,
              child: Image.network(
                headerPhoto,
                width: MediaQuery.of(context).size.width,
                fit: BoxFit.cover,
              ),
            ),
          ),
        )
       
    
    ...
  ,
  future: _fetchHeaderPhoto(userData),
);

当我像上面一样在 FutureBuilder 中使用 Hero 小部件时,第一个动画会正常工作。但是当我从 PageView 导航回来时——其中只有 Hero 小部件——动画不起作用。另一方面,当我尝试使用带有硬编码字符串的 Hero 小部件时:

Hero(
  tag: 'headerView',
  transitionOnUserGestures: true,
  child: Image.network(
    'https://picsum.photos/200/300',
    fit: BoxFit.cover,
  ),
)

第一个动画和第二个动画都完美运行。出现这个问题是因为我使用了 FutureBuilder 吗?如果不是什么问题?

提前致谢。

【问题讨论】:

【参考方案1】:

这是因为FutureBuilder 每次重建整个第一个小部件时都会获取数据。 为防止这种情况,请创建获取 headerPhoto 的新函数并更新第一个小部件的状态。在initState 中调用这个函数。这应该可以解决问题。

【讨论】:

以上是关于Flutter - 来自 Firebase 的英雄小部件子图像 url的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中缓存来自 Firebase 的图像?

Flutter(Firebase)约会应用,来自同一集合的文档之间的关系

Flutter 中来自 Firebase 的应用检查不起作用

在 Flutter 中,如何使用 CachedNetworkImage 显示来自 Firebase 的离线图像?

Flutter & firebase:我怎么能做一个“只包含来自”的查询

Flutter:显示来自经过身份验证的 Firebase Auth 用户的带有 StreamBuilder 的一些 Firestore 集合