使图像的边缘变暗?

Darken edges of an Image in flutter?

如何在 flutter 中为图像的边缘添加阴影,以便白色覆盖的文本可读?我希望它看起来就像在联系人应用程序中一样:

我已经检查了图像 class,但我只看到 colorcolorBlendMode,这将这是最简单的方法,我敢肯定。

我使用以下代码解决了我的问题。 (做这个的时候,不要用box-shadow,会导致全黑):

Stack(
  children: <Widget>[
    Image(
      fit: BoxFit.cover,
      image: AssetImage("assets/test.jpg"),
      height: MediaQuery.of(context).size.width * 0.8,
      width: MediaQuery.of(context).size.width,
    ),
    Container(
      height: MediaQuery.of(context).size.width * 0.8,
      width: MediaQuery.of(context).size.width,
      decoration: BoxDecoration(
        gradient: LinearGradient(
          begin: Alignment.topCenter,
          end: Alignment.bottomCenter,
          colors: [
            const Color(0xCC000000),
            const Color(0x00000000),
            const Color(0x00000000),
            const Color(0xCC000000),
          ],
        ),
      ),
    ),
    new Padding(
      padding: const EdgeInsets.all(16.0),
      child: Text("TXT", style: Theme.of(context).primaryTextTheme.title,),
    ),
  ],
),

接受的答案对我来说工作正常。但在我的例子中,图像是通过网络加载的,所以即使图像还没有显示,暗边也是可见的,这对我来说是错误的。所以我有另一种方法,使用 frameBuilder - 这是 Image 的 属性 本身之一。这种方法的另一个优点是我们不需要使用 Stack:

Image.network(
        "https://foo.com/bar.jpg",
        width: double.infinity,
        height: expandedHeight,
        fit: BoxFit.fitWidth,
        frameBuilder: (BuildContext context, Widget child, int frame, bool wasSynchronouslyLoaded) {
          if (wasSynchronouslyLoaded || frame != null) {
            return Container(
              child:child,
              foregroundDecoration: BoxDecoration(
                  gradient: LinearGradient(
                      begin: Alignment.topCenter,
                      end: Alignment.bottomCenter,
                      colors: [
                        const Color(0xCC000000),
                        const Color(0x00000000),
                        const Color(0x00000000),
                        const Color(0xCC000000),                ]
                  )
              ),
              height: expandedHeight,
              width: double.infinity,
            );
          } else {
            return Container(
              child: CircularProgressIndicator(
                  value: null,
                  backgroundColor: Colors.white),
              alignment: Alignment(0, 0),
              constraints: BoxConstraints.expand(),
            );
          }
        },
      ),

通过使用这段代码,我能够延迟暗边缘的显示,直到显示图像。如果 wasSynchronouslyLoadedtrue 那么这意味着图像可以立即加载,如果它是 false 那么我们必须依靠 frame 来判断图像是否可以显示。如果图像不可用,那么它将显示 CircularProgressIndicator 作为图像的占位符。