首页 > 解决方案 > Flutter NestedScrollView 错误:断言失败:第 4944 行 pos 14:'_dependents.isEmpty':不正确

问题描述

我正在尝试使用 NestedScrollView,但遇到了问题。我已将代码简化为这个简单的示例,展示了这个问题。

var tabs = ['Tab1', 'Tab2', 'Tab3'];
@override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 3,
      child: NestedScrollView(
        headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
          return [
            SliverAppBar(
              pinned: true,
              expandedHeight: 200.0,
              bottom: TabBar(
                tabs: tabs.map((tab) => Tab(text: tab)).toList(),
              ),
            )
          ];
        },
        body: TabBarView(
          children: [
            _wrapTabWidget(Text('Tab 1')),
            _wrapTabWidget(Text('Tab 2')),
            _wrapTabWidget(Text('Tab 3'))
          ],
        ),
      ),
    );
  }

  _wrapTabWidget(tabWidget) {
    return Builder(
      builder: (BuildContext context) {
        return CustomScrollView(
          slivers: <Widget>[
            SliverOverlapInjector(
              handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
            ),
            tabWidget
          ],
        );
      },
    );
  }

我得到的错误是:

'package:flutter/src/widgets/framework.dart': Failed assertion: line 4944 pos 14: '_dependents.isEmpty': is not true.
The relevant error-causing widget was: 
  NestedScrollView

我以前没有使用过 NestedScrollView,所以我假设我缺少一些简单的东西,但我不确定是什么。

标签: flutter

解决方案


您可以在下面复制粘贴运行完整代码
第 1 步:您需要SliverOverlapAbsorberSliverOverlapInjector
2 步:您需要SliverToBoxAdapterSliverToBoxAdapter是一个包含单个框小部件的条子。

代码片段

  _wrapTabWidget(tabWidget2(Text("Tab1"))),

 Widget tabWidget2(Text text) {
    return SliverToBoxAdapter(
      child: text,
    );
  }

工作演示

在此处输入图像描述

完整代码

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  List<String> tabs = ['Tab1', 'Tab2', 'Tab3'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: DefaultTabController(
        length: tabs.length, // This is the number of tabs.
        child: NestedScrollView(
          headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
            return <Widget>[
              SliverOverlapAbsorber(
                handle:
                    NestedScrollView.sliverOverlapAbsorberHandleFor(context),
                sliver: SliverAppBar(
                  title: const Text('Books'),
                  pinned: true,
                  expandedHeight: 200.0,
                  forceElevated: innerBoxIsScrolled,
                  bottom: TabBar(
                    // These are the widgets to put in each tab in the tab bar.
                    tabs: tabs.map((String name) => Tab(text: name)).toList(),
                  ),
                ),
              ),
            ];
          },
          body: TabBarView(
            children: [
              _wrapTabWidget(tabWidget2(Text("Tab1"))),
              _wrapTabWidget(tabWidget2(Text("Tab2"))),
              _wrapTabWidget(tabWidget2(Text("Tab3"))),
            ],
          ),
        ),
      ),
    );
  }


  Widget tabWidget2(Text text) {
    return SliverToBoxAdapter(
      child: text,
    );
  }

  _wrapTabWidget(tabWidget) {
    return Builder(
      builder: (BuildContext context) {
        return CustomScrollView(
          slivers: <Widget>[
            SliverOverlapInjector(
              handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
            ),
            tabWidget
          ],
        );
      },
    );
  }
}

推荐阅读