Skip to content

[Bug report] GridView长度发生变化后,无法jumpTo新增的item #150

Description

@qwqwqw213

Version

1.27.0

Platforms

iOS, Android

Device Model

readme(Android 10)

flutter info

[√] Flutter (Channel stable, 3.44.6, on Microsoft Windows [版本 10.0.26200.9168], locale zh-CN) [473ms]
    • Flutter version 3.44.6 on channel stable at D:\lib\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision ee80f08bbf (6 weeks ago), 2026-07-08 15:02:06 -0700
    • Engine revision 83675ed276
    • Dart version 3.12.2
    • DevTools version 2.57.0
    • Pub download mirror https://pub.flutter-io.cn
    • Flutter download mirror https://storage.flutter-io.cn
    • Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-swift-package-manager,
      omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration

[√] Windows Version (11 Home China 64-bit, 25H2, 2009) [1,647ms]

[√] Android toolchain - develop for Android devices (Android SDK version 37.0.0) [3.3s]
    • Android SDK at D:\lib\android_kid\sdk
    • Emulator version 36.6.11.0 (build_id 15507667) (CL:N/A)
    • Platform android-37.0, build-tools 37.0.0
    • ANDROID_HOME = D:\lib\android_kid\sdk
    • Java binary at: D:\tool\AndroidStudio\jbr\bin\java
      This is the JDK bundled with the latest Android Studio installation on this machine.
      To manually set the JDK path, use: `flutter config --jdk-dir="path/to/jdk"`.
    • Java version OpenJDK Runtime Environment (build 17.0.11+0--11852314)
    • All Android licenses accepted.

[X] Chrome - develop for the web (Cannot find Chrome executable at .\Google\Chrome\Application\chrome.exe) [184ms]
    ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.

[√] Visual Studio - develop Windows apps (Visual Studio 生成工具 2026 18.7.0) [182ms]
    • Visual Studio at D:\lib\msvc_2022
    • Visual Studio 生成工具 2026 version 18.7.11903.348
    • Windows 10 SDK version 10.0.26100.0

[√] Connected device (3 available) [395ms]
    • Redmi Note 7 Pro (mobile) • 1d67d46e • android-arm64  • Android 10 (API 29)
    • Windows (desktop)         • windows  • windows-x64    • Microsoft Windows [版本 10.0.26200.9168]
    • Edge (web)                • edge     • web-javascript • Microsoft Edge 151.0.4129.86

How to reproduce?

在DEMO中
一开始点击add后list会新增并setState重绘,再点击jump进行跳转
无法跳转到新增item
第二次点击jump则可以跳转
我认为这是grid没有加载非可视区域item导致的(list新增后_scrollCtrl.position.maxScrollExtent未发生变化)

Logs

Example code (optional)

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:scrollview_observer/scrollview_observer.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SystemChrome.setPreferredOrientations([
    DeviceOrientation.landscapeLeft,
    DeviceOrientation.landscapeRight,
  ]);
  runApp(const MyApp());
}

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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: .fromSeed(seedColor: Colors.deepPurple),
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<Color> _list = [];

  final ScrollController _scrollCtrl = ScrollController();

  late GridObserverController _observerCtrl;

  void _add() {
    final List<Color> list = [
      Colors.red,
      Colors.green,
      Colors.blue,
      Colors.yellow,
    ];
    for(int i = 0; i < 5; i ++) {
      _list.addAll(list);
    }

    setState(() {
      
    });
  }

  void _jump() {
    _observerCtrl.jumpTo(
      index: _list.length - 1,
      isFixedHeight: true,
    );
  }

  @override
  void initState() {
    super.initState();

    _observerCtrl = GridObserverController(controller: _scrollCtrl);

    _add();
  }

  @override
  Widget build(BuildContext context) {
    final crossCount = 4;
    final crossSpacing = 5.0;
    final Size screen = MediaQuery.of(context).size;

    final double cellWidth = (screen.width - (crossCount - 1) * crossSpacing) / crossCount;

    debugPrint("list length: ${_list.length} cellSize: $cellWidth");

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text("Observer grid"),
        actions: [
          const SizedBox(width: 10),
          TextButton(onPressed: _add, child: const Text("1st add")), // first click
          const SizedBox(width: 10),
          TextButton(onPressed: _jump, child: const Text("2nd jump")), // second click
          const SizedBox(width: 10),
        ],
      ),
      body: Center(
        child: GridViewObserver(
          controller: _observerCtrl,
          child: GridView.custom(
            controller: _scrollCtrl,
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: crossCount,
              mainAxisSpacing: crossSpacing,
              crossAxisSpacing: crossSpacing,
              mainAxisExtent: cellWidth,
            ),
            childrenDelegate: SliverChildBuilderDelegate(
              (ctx, index) {
                return Container(
                  color: _list[index],
                  child: Center(
                    child: Text(
                      (index + 1).toString(),
                      style: const TextStyle(color: Colors.black, fontSize: 22),
                    ),
                  ),
                );
              },
              childCount: _list.length,
            ),
          ),
        ),
      ),
    );
  }
}

Contact

382805749@qq.com

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions