【问题标题】:Flutter SliverList and CustomScrollView Error: 'owner.debugCurrentBuilderTarget == this' : is not trueFlutter SliverList 和 CustomScrollView 错误:'owner.debugCurrentBuilderTarget == this':不正确
【发布时间】:2021-05-03 20:08:35
【问题描述】:

大家好,我正在尝试构建一个可重用的 SliverList,我只是将 sliver 小部件作为列表传递到其中以显示,并为填充加倍,但目前出现此错误

我正在尝试构建的可重用小部件的代码

class ScrollScreen extends StatelessWidget {
  ScrollScreen({
    @required this.pageTitle,
    @required this.pageImage,
    @required this.widgets,
    this.color = Colors.white,
  });

  final String pageTitle;
  final String pageImage;
  final List<Widget> widgets;
  final Color color;

  @override
Widget build(BuildContext context) {
return CustomScrollView(physics: const BouncingScrollPhysics(), slivers: [
  SliverBar(title: pageTitle, image: pageImage),
  SliverListLayout(widgets: widgets),
]);

}

SliverListLayout 类

class SliverListLayout extends StatelessWidget {
final double paddingTB;
final double paddingLR;
final List<Widget> widgets;
SliverListLayout({
@required this.widgets,
this.paddingTB,
this.paddingLR,
});

@override
Widget build(BuildContext context) {
return SliverList(
  delegate: SliverChildListDelegate([
    ...addPadding(widgets, paddingTB, paddingLR), //add padding wraps widgets in a padding widget and returns them,, not the issue works fine elsewhere
  ]),
);
}

} 堆栈跟踪:

The following NoSuchMethodError was thrown building             
NotificationListener<KeepAliveNotification>:
The method '>=' was called on null.
Receiver: null
Tried calling: >=(0.0)

The relevant error-causing widget was
SliverList
lib\…\custom_widgets\sliverlist_layout.dart:15
When the exception was thrown, this was the stack
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1      EdgeInsetsGeometry.isNonNegative
package:flutter/…/painting/edge_insets.dart:52
#2      new RenderPadding
package:flutter/…/rendering/shifted_box.dart:107
#3      Padding.createRenderObject
package:flutter/…/widgets/basic.dart:1652
#4      RenderObjectElement.mount

颤振医生:

PS C:\Users\Usuario\Desktop\AppName> flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 1.22.5, on Microsoft Windows [Versión 10.0.19042.746], locale es-ES)
 
[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses
[!] Android Studio (version 4.1.0)
    X Flutter plugin not installed; this adds Flutter specific functionality.
    X Dart plugin not installed; this adds Dart specific functionality.      
[√] VS Code (version 1.52.1)
[√] Connected device (1 available)

! Doctor found issues in 2 categories.
PS C:\Users\Usuario\Desktop\AppName> 

添加填充

List<Widget> addPadding(List<Widget> widgets,
    [double paddingTB = 25.0, double paddingLR = 25.0]) {
  for (int i = 0; i < widgets.length; i++) {
    widgets[i] = Padding(
      padding: EdgeInsets.fromLTRB(
        paddingLR,
        paddingTB,
        paddingLR,
        paddingTB,
      ),
      child: widgets[i],
    );
  }
  return widgets;
}

我粘贴了 SliverListLayout 类中的代码(没有两个额外的参数),一切正常。 SliverBar 还返回一个 SliverAppBar,它工作正常。非常感谢任何帮助。

【问题讨论】:

    标签: flutter dart error-handling flutter-sliver sliver-grid


    【解决方案1】:

    我不确定如何重现您的问题。我会推荐:

    1. 发布一个完整但最小的代码示例来重现您的问题
    2. 发布完整的控制台错误堆栈跟踪
    3. 提供有关您的配置的更多信息(颤振医生)

    这是一个简单的小代码示例,类似于(我认为)您尝试实现的目标。

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(
        MaterialApp(
          home: Scaffold(
              body: ReusableSliverList(
            title: 'Testing my ReusableSliverList',
            widgetPadding: EdgeInsets.symmetric(horizontal: 32.0, vertical: 16.0),
            widgets: List.generate(10, (index) => Text('Widget $index')).toList(),
          )),
        ),
      );
    }
    
    class ReusableSliverList extends StatelessWidget {
      final String title;
      final List<Widget> widgets;
      final EdgeInsets widgetPadding;
    
      const ReusableSliverList({
        Key key,
        this.title,
        this.widgets,
        this.widgetPadding,
      }) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return CustomScrollView(
          physics: const BouncingScrollPhysics(),
          slivers: [
            SliverAppBar(title: Text(title)),
            SliverList(
              delegate: SliverChildListDelegate(
                widgets
                    .map((widget) => Padding(padding: widgetPadding, child: widget))
                    .toList(),
              ),
            ),
          ],
        );
      }
    }
    

    基于您的问题编辑的完整工作代码(使用 addPadding):

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(
        MaterialApp(
          title: 'Flutter Demo',
          home: Scaffold(
            body: ScrollScreen(
              widgets: List.generate(10, (index) => Text('Widget $index')),
            ),
          ),
        ),
      );
    }
    
    class ScrollScreen extends StatelessWidget {
      ScrollScreen({
        // @required this.pageTitle,
        // @required this.pageImage,
        @required this.widgets,
        this.color = Colors.white,
      });
    
      // final String pageTitle;
      // final String pageImage;
      final List<Widget> widgets;
      final Color color;
    
      @override
      Widget build(BuildContext context) {
        return CustomScrollView(physics: const BouncingScrollPhysics(), slivers: [
    //      SliverBar(title: pageTitle, image: pageImage),
          SliverListLayout(
            widgets: widgets,
            paddingLR: 16.0,
            paddingTB: 32.0,
          ),
        ]);
      }
    }
    
    class SliverListLayout extends StatelessWidget {
      final double paddingTB;
      final double paddingLR;
      final List<Widget> widgets;
      SliverListLayout({
        @required this.widgets,
        this.paddingTB,
        this.paddingLR,
      });
    
      @override
      Widget build(BuildContext context) {
        return SliverList(
          delegate: SliverChildListDelegate([
            ...addPadding(
              widgets,
              paddingTB,
              paddingLR,
            ),
          ]),
        );
      }
    
      List<Widget> addPadding(List<Widget> widgets,
          [double paddingTB = 25.0, double paddingLR = 25.0]) {
        for (int i = 0; i < widgets.length; i++) {
          widgets[i] = Padding(
            padding: EdgeInsets.fromLTRB(
              paddingLR,
              paddingTB,
              paddingLR,
              paddingTB,
            ),
            child: widgets[i],
          );
        }
        return widgets;
      }
    }
    

    【讨论】:

    • 就是这样,但是当我将 SliverList 的代码移动到单独的代码并尝试使用它时,就会发生错误
    • 您能否提供失败示例的完整源代码?
    • 你需要什么?除了上面提供的只有 addPadding 方法和返回 App Bar 的类 SliverBar
    • 嗯,我需要的是失败的部分。我怀疑这是您的addPadding 方法,因为错误跟踪提到了edgeInsetsGeometry。但是,我不确定。我将使用完整的工作代码更新答案,其中我删除了您未提供的部分:SliverBaraddPadding
    • 谢谢,我会发布 addPadding 并将其删除以防万一
    猜你喜欢
    • 2021-02-14
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2021-08-01
    • 2021-10-28
    • 2020-04-29
    • 2020-01-06
    相关资源
    最近更新 更多