You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter实现双向滚动15×10带唯一键网格的方案咨询

Flutter 15×10双向滚动网格实现方案

直接用嵌套SingleChildScrollView+GridView.count就能解决问题,核心是禁用GridView自身的滚动,让外层滚动视图接管双向滚动,同时给每个网格生成唯一键。

完整实现代码

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('15×10双向滚动网格')),
        body: const ScrollableGrid(),
      ),
    );
  }
}

class ScrollableGrid extends StatelessWidget {
  const ScrollableGrid({super.key});

  // 网格参数:15列,10行
  static const int columns = 15;
  static const int rows = 10;
  static const double gridSize = 60; // 单个网格的宽高

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      // 垂直滚动
      scrollDirection: Axis.vertical,
      child: SingleChildScrollView(
        // 水平滚动
        scrollDirection: Axis.horizontal,
        // 固定宽度确保水平滚动有效
        child: SizedBox(
          width: columns * gridSize,
          child: GridView.count(
            crossAxisCount: columns,
            // 自适应高度,避免无限滚动
            shrinkWrap: true,
            // 禁用GridView自身滚动,交给外层ScrollView处理
            physics: const NeverScrollableScrollPhysics(),
            // 生成150个网格(15×10)
            children: List.generate(columns * rows, (index) {
              final row = index ~/ columns;
              final col = index % columns;
              // 用行列索引生成唯一键,方便后续访问
              return GridBox(
                key: ValueKey('grid-$row-$col'),
                row: row,
                col: col,
                size: gridSize,
              );
            }),
          ),
        ),
      ),
    );
  }
}

// 自定义网格组件
class GridBox extends StatelessWidget {
  final int row;
  final int col;
  final double size;

  const GridBox({
    super.key,
    required this.row,
    required this.col,
    required this.size,
  });

  @override
  Widget build(BuildContext context) {
    return Container(
      width: size,
      height: size,
      decoration: BoxDecoration(
        border: Border.all(color: Colors.grey.shade300),
        color: (row + col) % 2 == 0 ? Colors.grey.shade50 : Colors.white,
      ),
      child: Center(
        child: Text(
          'R${row+1}C${col+1}',
          style: const TextStyle(fontSize: 14),
        ),
      ),
    );
  }
}

关键细节说明

  • 双向滚动实现:嵌套两个SingleChildScrollView,分别处理垂直和水平方向的滚动,外层负责垂直、内层负责水平。
  • GridView配置:设置shrinkWrap: true让GridView自适应内容高度,physics: NeverScrollableScrollPhysics()禁用自身滚动,避免和外层滚动逻辑冲突。
  • 唯一键生成:用ValueKey结合行列索引生成唯一标识(如grid-0-0),后续如果需要通过键定位特定网格,可基于此扩展。
  • 固定宽度:内层SizedBox设置固定宽度(列数×单个网格宽度),确保水平滚动能正常触发。

替代方案(可选)

如果需要表头固定等复杂滚动效果,可改用CustomScrollView结合SliverGrid,但基础双向滚动需求用上述方案足够简洁高效。

内容的提问来源于stack exchange,提问作者Manish Dhakrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:22:46