【问题标题】:How do I add a container at the end of my grid view in Flutter?如何在 Flutter 中的网格视图末尾添加一个容器?
【发布时间】:2020-05-05 17:36:52
【问题描述】:

我有一个 GridView,我想在 gridview 滚动结束后添加一个横幅广告。 BannerAd 是从依赖项https://github.com/kmcgill88/admob_flutter 中调用的。 GridView的代码如下

Widget build(BuildContext context) {
  SystemChrome.setEnabledSystemUIOverlays([]);
  return WillPopScope(
    onWillPop: () async {
      return true;
    },
    child: Scaffold(
      body: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
            colors: [const Color(0xFFFEFEFE), const Color(0xFFFEFEFE)],
            begin: Alignment.centerLeft,
            end: Alignment.centerRight,
          ),
        ),
        child: Stack(children: <Widget>[
          Text(
            "Daily Tasks",
            style: TextStyle(
              fontFamily: "Netflix",
              fontWeight: FontWeight.w600,
              fontSize: 35,
              letterSpacing: 0.27,
              color: Color(0xFFFF8C3B),
            ),
          ),
          Expanded(
            flex: 20,
            child: GridView.builder(
              itemCount: homeList.length,
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 2, mainAxisSpacing: 20),
              itemBuilder: (ctx, i) {
                return GestureDetector(
                  onTap: () async {
                    if (i == 0) {
                      if (await interstitialAd.isLoaded) {
                        interstitialAd.show();
                      } else {
                        dailyRewardAlert(context);
                      }
                    } else if (i == 1) {
                      FlutterPollfish.instance.show();
                    } else if (i == 2) {
                      sendInvite();
                    } else if (i == 3) {
                      hideBannerAd();
                      Navigator.push(context,
                          MaterialPageRoute(builder: (context) => Roulette()));
                    } else if (i == 4) {
                      hideBannerAd();
                      Navigator.push(context,
                          MaterialPageRoute(builder: (context) => Scratch()));
                    }
                  },
                  child: Container(
                    decoration: BoxDecoration(
                      borderRadius:
                          const BorderRadius.all(Radius.circular(16.0)),
                    ),
                    width: 150,
                    margin: const EdgeInsets.symmetric(horizontal: 11.0),
                    child: Container(
                      child: ClipRRect(
                        borderRadius: BorderRadius.circular(19.0),
                        child: Stack(
                          children: <Widget>[
                            Positioned.fill(
                              child: Image.asset(
                                homeList[i].imagePath,
                                fit: BoxFit.cover,
                              ),
                            ),
                            Positioned(
                              bottom: 0,
                              left: 0,
                              right: 0,
                              child: Container(
                                padding: EdgeInsets.symmetric(
                                    horizontal: 9.0, vertical: 5.0),
                                decoration: BoxDecoration(
                                    gradient: LinearGradient(
                                      colors: [
                                        const Color(0xFFFF8C3B),
                                        const Color(0xFFFE524B)
                                      ],
                                      begin: Alignment.centerLeft,
                                      end: Alignment.centerRight,
                                    ),
                                    borderRadius: BorderRadius.only(
                                        topRight: Radius.circular(15))),
                                child: Column(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: <Widget>[
                                    Text(
                                      "${homeList[i].taskTitle}",
                                      style: TextStyle(
                                        fontFamily: "Netflix",
                                        fontWeight: FontWeight.w600,
                                        fontSize: 17,
                                        letterSpacing: 0.27,
                                        color: Colors.white,
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                            ),
                          ],
                        ),
                      ),
                    ),
                  ),
                );
              },
            ),
          ),
        ]),
      ),
    ),
  );
}

我是 Flutter 的新手,这对我很有帮助,非常感谢您的贡献! :) 我需要网格视图方面的帮助

【问题讨论】:

  • 你能把代码格式化一下吗?
  • 我格式化了,你可以看看
  • 你屏幕的可滚动区域是多少?
  • 我无法理解你为什么要使用堆栈小部件!
  • 我在首页的gridVI上方有几个组件\iew

标签: user-interface flutter gridview dart user-experience


【解决方案1】:

这是解决方案之一! 更新:

List<String> homeList = [];

  @override
  void initState() {
    super.initState();
    homeList = List.generate(15, (ind) => 'Item $ind').toList();
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        return true;
      },
      child: Scaffold(
        body: Container(
          decoration: BoxDecoration(
            gradient: LinearGradient(
              colors: [const Color(0xFFFEFEFE), const Color(0xFFFEFEFE)],
              begin: Alignment.centerLeft,
              end: Alignment.centerRight,
            ),
          ),
          child: ListView(
            children: <Widget>[
            Container(
              child: Text(
                "Daily Tasks",
                style: TextStyle(
                  fontFamily: "Netflix",
                  fontWeight: FontWeight.w600,
                  fontSize: 35,
                  letterSpacing: 0.27,
                  color: Color(0xFFFF8C3B),
                ),
              ),
              padding: EdgeInsets.fromLTRB(10, 10, 0, 10),
            ),
            Stack(children: [
              GridView.builder(
                shrinkWrap: true,
                itemCount: homeList.length,
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                    crossAxisCount: 2, mainAxisSpacing: 20),
                itemBuilder: (ctx, i) {
                  return GestureDetector(
                    onTap: () async {
//                     if (i == 0) {
//                       if (await interstitialAd.isLoaded) {
//                         interstitialAd.show();
//                       } else {
//                         dailyRewardAlert(context);
//                       }
//                     } else if (i == 1) {
//                       FlutterPollfish.instance.show();
//                     } else if (i == 2) {
//                       sendInvite();
//                     } else if (i == 3) {
//                       hideBannerAd();
//                       Navigator.push(context,
//                           MaterialPageRoute(builder: (context) => Roulette()));
//                     } else if (i == 4) {
//                       hideBannerAd();
//                       Navigator.push(context,
//                           MaterialPageRoute(builder: (context) => Scratch()));
//                     }
                    },
                    child: Container(
                      decoration: BoxDecoration(
                        borderRadius:
                            const BorderRadius.all(Radius.circular(16.0)),
                      ),
                      width: 150,
                      margin: const EdgeInsets.symmetric(horizontal: 11.0),
                      child: Container(
                        child: ClipRRect(
                          borderRadius: BorderRadius.circular(19.0),
                          child: Stack(
                            children: <Widget>[
                              Positioned.fill(
//                               child: Image.asset(
//                                 homeList[i].imagePath,
//                                 fit: BoxFit.cover,
//                               ),
                                  child: Container(
                                      decoration: BoxDecoration(
                                          borderRadius:
                                              BorderRadius.circular(10),
                                          color: Colors.orange))),
                              Positioned(
                                bottom: 0,
                                left: 0,
                                right: 0,
                                child: Container(
                                  padding: EdgeInsets.symmetric(
                                      horizontal: 9.0, vertical: 5.0),
                                  decoration: BoxDecoration(
                                      gradient: LinearGradient(
                                        colors: [
                                          const Color(0xFFFF8C3B),
                                          const Color(0xFFFE524B)
                                        ],
                                        begin: Alignment.centerLeft,
                                        end: Alignment.centerRight,
                                      ),
                                      borderRadius: BorderRadius.only(
                                          topRight: Radius.circular(15))),
                                  child: Column(
                                    crossAxisAlignment:
                                        CrossAxisAlignment.start,
                                    children: <Widget>[
                                      Text(
                                        homeList[i],
                                        style: TextStyle(
                                          fontFamily: "Netflix",
                                          fontWeight: FontWeight.w600,
                                          fontSize: 17,
                                          letterSpacing: 0.27,
                                          color: Colors.white,
                                        ),
                                      ),
                                    ],
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ),
                      ),
                    ),
                  );
                },
              ),
            ]),
            Container(
                alignment: Alignment.center,
                height: 50,
                decoration: BoxDecoration(
                  gradient: LinearGradient(
                    colors: [Colors.blue, Colors.blueAccent],
                    begin: Alignment.centerLeft,
                    end: Alignment.centerRight,
                  ),
                  borderRadius: BorderRadius.circular(15),
                ),
                child: Text('Your widget at the end'))
          ]),
        ),
      ),
    );

【讨论】:

  • 关于使用 ListView 而不是我的所有组件都消失了。
  • 好的,所以这有效,但 gridView 不滚动
  • 好吧!我在 dartpad 中测试过!我不知道为什么它不适合你!!!
  • 列表视图和网格视图正常显示,但只是没有滚动。你能推荐点什么吗?
  • 您是否添加/更改了我的答案中没有的任何其他属性???
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多