Flutter异常:ScrollController附加到多个滚动视图

Flutter异常:ScrollController附加到多个滚动视图,第1张

Flutter异常:ScrollController附加到多个滚动视图

不要

_scrollController.offset
直接使用推入路线,因为当您再次d出时接近滚动时,显然会附加要获取的滚动位置

所以我们需要将其转移到一个状态

这是完整的修订代码。

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;  //Offset state <-------------------------------------  double offset = 0.0 ;  @override  void initState() {    super.initState();    //print("init state is called");    _scrollController = ScrollController() //keepScrollOffset: false removed      ..addListener(() {        setState(() {          //<-----------------------------          offset = _scrollController.offset;          // 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    print("_createSliverAppBar is called");    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 ){      print("positions is ${_scrollController.positions.length}");      return 0.0;    }    //print("offset is${_scrollController.offset} and positions is ${_scrollController.positions.length}");    return (offset / (_kExpandedHeight - kToolbarHeight)).clamp(0.0, 1.0);  }}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5016688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存