【问题标题】:GridView containing Cards are getting Trimmed at the end in Flutter包含卡片的 GridView 最终在 Flutter 中被修剪
【发布时间】:2021-04-07 12:12:15
【问题描述】:

我正在尝试使用卡片作为列表元素创建一个网格视图页面,并且最后一张卡片正在从底部切开。以下是相关代码sn-ps:

createListBody.dart

List<String> services = [
    
    'Demo1',
    'Demo2',
    'Demo3',
    'Demo4',
    'Demo5',
    'Demo6',
    'Demo7',
    'Demo8',
    'Demo9',
    'Demo10',
  ];

  @override
  Widget build(BuildContext context) {
    return Container(
      height: MediaQuery.of(context).size.height,
      child: GridView.count(
        crossAxisCount: 2,
        crossAxisSpacing: 2.0,
        mainAxisSpacing: 2.0,
        children: services.map((String serviceName){
          return Container(
            child:Card(
              color: Colors.grey[500],
              elevation: 15,
              semanticContainer: true,
              shadowColor: palletFuchsia,
              shape: CircleBorder(),
              child: InkWell(
                onTap: (){
                  print("Tapped "+serviceName);
                },
                child: Center(
                  child: Text(
                    serviceName,
                    style: TextStyle(
                      fontWeight: FontWeight.bold,
                      fontSize: 25
                    ),
                  ),
                ),
              ),
            )
          );
        }).toList(),
      ),
    );
  }

listScreen.dart

Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: palletWhiteDrawer,
      drawer: Theme(
        data: Theme.of(context).copyWith(
          canvasColor: palletYellowDrawer,
        ),
        child: CreatDrawerWidget(),
      ),
      appBar: CreateAppBar(),
      body:GestureDetector(
        behavior: HitTestBehavior.opaque,
        onTap: () {
          FocusScope.of(context).requestFocus(new FocusNode());
        },
        child: SingleChildScrollView(
            
            child: Column(
              mainAxisSize: MainAxisSize.max,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                ServiceListBody()
              ],
            )
          ),
        ),
    );
  }

截图

我对颤振完全陌生,如果有一些愚蠢的错误,我很抱歉。但任何帮助都是有用的。 感谢您的宝贵时间!

【问题讨论】:

    标签: android flutter dart flutter-layout flutter-gridview


    【解决方案1】:

    只是为了探索,你可以height: MediaQuery.of(context).size.height *2,它不应该再被砍了吧?

    解决方案 1

    无论您在ListView 中有多少物品,您都会告诉您的容器一个给定的高度,该高度目前是固定的。

    例如,您可以使用 ConstrainedBoxshrinkWrap:true 并管理您的最大高度

    ConstrainedBox(
      constraints: BoxConstraints(maxHeight: 200, minHeight: 56.0),
      child: ListView.builder(
        shrinkWrap: true,
        ...
    

    更多信息:https://api.flutter.dev/flutter/widgets/ConstrainedBox-class.html


    解决方案 2

    使用Slivers,它们是动态的。

    为此,您需要稍微自定义结构。你用CustomScrollView()SliverToBoxAdapter() 为固定元素和SliverList() 为动态元素包装所有东西,让它像魅力一样工作。

    使用CustomScrollViewSliverToBoxAdapter 的示例:

    return SafeArea(
          child: CustomScrollView(
            //scrollDirection: Axis.vertical,
            physics: BouncingScrollPhysics(),
            slivers: <Widget>[
              // Place sliver widgets here
              SliverToBoxAdapter(
                  child: Padding(
                      padding: const EdgeInsets.fromLTRB(25, 30, 25, 20),
                      child: SizedBox(
                        height: 299,
                        child: Column(children: <Widget>[
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            crossAxisAlignment: CrossAxisAlignment.center,
                            children: <Widget>[
                            ...
    

    您可以使用SizedBox height 定义高度。你也可以在CustomScrollView上为你的整个视图应用漂亮的效果

    Sliverlist 示例:

       SliverList(
          delegate: SliverChildBuilderDelegate(
        (ctx, index) => ChangeNotifierProvider.value(
          value: list[index],
          child: GestureDetector(
            onTap: () {}),
            childCount: list.length,
      )),
    

    有关条子的信息:https://medium.com/flutterdevs/explore-slivers-in-flutter-d44073bffdf6

    【讨论】:

    • 非常感谢,将尝试这些解决方案并评论结果! :)
    • 是的,不客气 :) 如果它帮助你确保投票为接受的答案
    • 制作height: MediaQuery.of(context).size.height*2 完全停止滚动,下面的卡片根本不渲染
    • 是的,可能是因为渲染错误。顺便说一句,我看到你使用了 Gridview。确保使用 SliverGrid 来获得完美的解决方案 :-) 检查一下:medium.com/flutter/slivers-demystified-6ff68ab0296f 您可以在示例中看到每个高度都是动态且可滚动的
    【解决方案2】:

    GridView 小部件本身是 Scrollable ,因此您不必用 ColumnSingleChildScrollView 小部件包装它... 如果圆圈离开屏幕,您现在可以简单地向下滚动

    如果您希望所有圆圈都适合屏幕.. 您必须使用

    var mobileHeight = MediaQuery.of(context).size.height

    然后每个圆圈的高度将是mobileHeight 除以编号。垂直的圆圈。

    【讨论】:

    • 是的,如果只使用GridView 小部件,页面工作得很好,但是我想在GridView 上方添加一个带有一些文本的Container,这就是为什么将它包装在列中小部件
    • @AmitDubey 然后你可以尝试用Expanded 包装GridView,然后你可以用Column 小部件安全地包装它。它给出了一个错误还有其他方法可以做到这一点......你可以查一下here
    猜你喜欢
    • 2020-10-31
    • 2021-12-29
    • 2020-08-25
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多