在Flutter中创建无限自动滚动GridView(或ListView)

时间:2020-07-23 04:58:09

标签: flutter flutter-animation

我正在为我的移动Flutter应用程序创建一个简介屏幕,我想要一个可以永久滚动且不可交互的简单背景。

这是我的问题的简化代码:

import 'package:flutter/material.dart';

class AnimatedBackground extends StatefulWidget {
  @override
  _AnimatedBackgroundState createState() => _AnimatedBackgroundState();
}

class _AnimatedBackgroundState extends State<AnimatedBackground> {
  ScrollController controller;

  double backgroundOffset = 0;

  @override
  void initState() {
    super.initState();
    controller = ScrollController();
    WidgetsBinding.instance
        .addPostFrameCallback((_) => scrollPage()); ///// ATTEMPT #1
//    beginAnimation(); ////// ATTEMPT #2
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  void beginAnimation() async { ///// ATTEMPT #2
    await Future.delayed(Duration(seconds: 5), scrollPage); ///// ATTEMPT #2
  } ///// ATTEMPT #2

  void scrollPage() {
    backgroundOffset += 20;
    controller
        .animateTo(
          backgroundOffset,
          duration: Duration(seconds: 1),
          curve: Curves.linear,
        )
        .then((_) => scrollPage()); // Forever keep scrolling
  }

  @override
  Widget build(BuildContext context) {
    return GridView.builder(
      controller: controller,
      physics: NeverScrollableScrollPhysics(),
      gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
        maxCrossAxisExtent: 200,
        crossAxisSpacing: 30,
        mainAxisSpacing: 30,
      ),
      itemBuilder: (context, index) => Text("TEMP"),
    );
  }
}

尝试#1时,出现此错误:

The following NoSuchMethodError was thrown while notifying listeners for AnimationController:
The method '<=' was called on null.
Receiver: null
Tried calling: <=(0.0)

When the exception was thrown, this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
#1      ClampingScrollPhysics.applyBoundaryConditions (package:flutter/src/widgets/scroll_physics.dart:494:34)
#2      ScrollPosition.applyBoundaryConditions (package:flutter/src/widgets/scroll_position.dart:399:35)
#3      ScrollPosition.setPixels (package:flutter/src/widgets/scroll_position.dart:228:33)
#4      ScrollPositionWithSingleContext.setPixels (package:flutter/src/widgets/scroll_position_with_single_context.dart:83:18)
...
The AnimationController notifying listeners was: AnimationController#fa4bb(▶ 18.388; for DrivenScrollActivity)

现在,它仅显示一次此错误,仅此而已。除了此错误,它还能按预期工作。 GridView缓慢滚动。但我仍然会收到该错误。

尝试#2时,我遇到了如上所述的错误,但是又出现了很多次,有时还会出现下面的错误。

E/flutter (21732): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: The method '>' was called on null.
E/flutter (21732): Receiver: null
E/flutter (21732): Tried calling: >(0.0)
E/flutter (21732): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
E/flutter (21732): #1      double.< (dart:core-patch/double.dart:90:18)
E/flutter (21732): #2      ScrollMetrics.outOfRange (package:flutter/src/widgets/scroll_metrics.dart:89:33)
.
.
.

那么,解决此问题的最佳方法是什么,如何避免maxScrollExtent为null的错误(这将导致方法<< ='如第一个错误所述在null上被调用)?我当然不喜欢尝试2,而且我也不知道尝试1是否是解决此问题的好方法。如果使用带有混入AnimationController的{​​{1}}是解决此问题的正确方法,我将不胜感激一个迷你示例,因为我不完全了解如何将其用于类似这样的事情。如果您能想到其他解决方案,我将非常感谢您的投入。

谢谢!

0 个答案:

没有答案