gpt4 book ai didi

flutter 异常 : ScrollController attached to multiple scroll views

转载 作者:IT王子 更新时间:2023-10-29 06:47:06 43 4
gpt4 key购买 nike

我的 Flutter 应用程序在离开具有 ScrollController 以控制 NestedScrollView 的页面时抛出异常(ScrollController 附加到多个 ScrollView )而我没有确定我做错了什么。

我用下面的一个简单示例重新创建了异常。我可以从 FirstPage 导航到 SecondPage(并可选择返回)就好了,但是当我从 SecondPage 导航到 ThirdPage 抛出异常。 SecondPage 是包含我的自定义 CollapsingAppBarPage 小部件的页面,我认为它有问题。 CollapsingAppBarPage 在此示例中得到了简化,但在我的真实应用中,它会根据滚动位置更改组件的颜色/大小。在此示例中,当导航开始到 ThirdPage 时调用 _scrollController.offset 时会发生异常。另外,我知道 FirstPage 和 ThirdPage 可以是 Stateless 而不是 StatefulWidgets,但我想让它尽可能像我的应用程序。这是我的完整示例。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: FirstPage(),
);
}
}

class FirstPage extends StatefulWidget {
@override
_FirstPageState createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("First Page"),
),
body: Center(
child: RaisedButton(
child: Text("Navigate Next"),
onPressed: () async {
await Navigator.push(context,
MaterialPageRoute(builder: (context) => SecondPage())
);
},
),
),
);
}
}

class SecondPage extends StatefulWidget {
@override
_SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
@override
Widget build(BuildContext context) {
return Material(
child: CollapsingAppBarPage(
titleText: "Second Page",
bodyCreator: (context) {
return ListView(
children: <Widget>[
Center(
child: RaisedButton(
child: Text("Navigate Next"),
onPressed: () async {
await Navigator.push(context,
MaterialPageRoute(builder: (context) => ThirdPage())
);
},
),
)
],
);
},
),
);
}
}

class ThirdPage extends StatefulWidget {
@override
_ThirdPageState createState() => _ThirdPageState();
}

class _ThirdPageState extends State<ThirdPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Third Page")
),
body: Container()
);
}
}

typedef CollapsingAppBarBodyCreator = Widget Function(BuildContext context);

class CollapsingAppBarPage extends StatefulWidget {

final String titleText;
final CollapsingAppBarBodyCreator bodyCreator;

CollapsingAppBarPage({
Key key,
this.titleText,
@required this.bodyCreator,
}) : super(key: key);

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

class _CollapsingAppBarPageState extends State<CollapsingAppBarPage> {

static const _kExpandedHeight = 200.0;

ScrollController _scrollController;

@override
void initState() {
super.initState();
_scrollController = ScrollController()
..addListener(() {
setState(() {
// force a refresh so the app bar can be updated
});
});
}

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

@override
Widget build(BuildContext context) {
return NestedScrollView(
controller: _scrollController,
headerSliverBuilder: _createSliverAppBar,
body: widget.bodyCreator(context),
);
}

List<Widget> _createSliverAppBar(BuildContext context, bool innerBoxIsScrolled) {
// change the icon color as the page scrolls
var collapsePercent = _getAppBarCollapsePercent();
int rgb = ((1.0 - collapsePercent) * 255).round();
var color = Color.fromARGB(255, rgb, rgb, rgb);

return <Widget>[
SliverAppBar(
expandedHeight: _kExpandedHeight,
pinned: true,
iconTheme: IconThemeData(color: color),
title: Text(widget.titleText),
)
];
}

double _getAppBarCollapsePercent() {
if (!_scrollController.hasClients)
return 0.0;

return (_scrollController.offset / (_kExpandedHeight - kToolbarHeight)).clamp(0.0, 1.0);
}
}

这里是异常的截断跟踪:

flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
flutter: The following assertion was thrown building Builder(dirty):
flutter: ScrollController attached to multiple scroll views.
flutter: 'package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 111 pos 12:
flutter: '_positions.length == 1'
flutter:
flutter: Either the assertion indicates an error in the framework itself, or we should provide substantially
flutter: more information in this error message to help you determine and fix the underlying cause.
flutter: In either case, please report this assertion by filing a bug on GitHub:
flutter: https://github.com/flutter/flutter/issues/new?template=BUG.md
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #2 ScrollController.position (package:flutter/src/widgets/scroll_controller.dart:111:12)
flutter: #3 ScrollController.offset (package:flutter/src/widgets/scroll_controller.dart:118:24)
flutter: #4 _CollapsingAppBarPageState._getAppBarCollapsePercent (package:flutter_scroll_test/main.dart:160:31)
flutter: #5 _CollapsingAppBarPageState._createSliverAppBar (package:flutter_scroll_test/main.dart:142:27)
flutter: #6 NestedScrollView._buildSlivers (package:flutter/src/widgets/nested_scroll_view.dart:271:20)
flutter: #7 _NestedScrollViewState.build.<anonymous closure> (package:flutter/src/widgets/nested_scroll_view.dart:347:29)
flutter: #8 Builder.build (package:flutter/src/widgets/basic.dart:5736:41)
flutter: #9 StatelessElement.build (package:flutter/src/widgets/framework.dart:3774:28)
flutter: #10 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3721:15)

最佳答案

如果在您的情况下,同一 View 上有多个 ListView,您也会遇到此错误。要解决它,您只需将以下属性添加到每个 listView 构建器中:

controller: ScrollController(),

之后你将拥有:

ListView.builder(
controller: ScrollController(),//just add this line
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index]),
);

来源是这个链接:Click here

关于 flutter 异常 : ScrollController attached to multiple scroll views,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53824944/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com