Flutter中如何使用PrimaryScrollController?

Jus*_*ill 5 flutter

我正在尝试利用 iOS 功能,当点击状态栏时,滚动视图会滚动到顶部。

我正在使用 ListView,根据文档,主要属性决定了此行为,但我需要使用 ScrollController 初始化 ListView,并引发错误:

'package:flutter/src/widgets/scroll_view.dart': 断言失败:第 62 行 pos 15: '!(controller != null && Primary == true)'

我有一个选项卡式应用程序,每个选项卡上都有一个 ListView,因此我需要显式创建 ScrollController 对象并使用它们来初始化 ListView 对象。

PrimaryScrollController 小部件可能允许我将 ScrollController 指定为主要的,但我找不到任何使用它的示例。更具体地说,我不明白 PrimaryScrollController 的 child 属性需要是什么。PrimaryScrollController 的使用示例将非常有帮助。

Oma*_*att 1

PrimaryScrollController 使用 ScrollView 标识屏幕上小部件的控制器。即使没有将 ScrollController 设置为 ListView 的控制器。

下面是从 ListView 底部滚动到顶部的示例。

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    ),
  );
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sample Scroll'),
      ),
      body: Center(
        /// No controller configured
        child: ListView.builder(
          itemCount: 20,
          itemBuilder: (BuildContext context, int index) {
            return Card(
              child: Container(
                height: 50.0,
                padding: EdgeInsets.all(16.0),
                child: Text('Item $index'),
              ),
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          var controller = PrimaryScrollController.of(context);
          controller!.animateTo(controller.position.minScrollExtent,
              duration: Duration(seconds: 2), curve: Curves.ease);
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

演示

如果使用ScrollController,则需要配置在ListView上。

class _MyHomePageState extends State<MyHomePage> {
  var scrollController = ScrollController();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sample Scroll'),
      ),
      body: Center(
        child: ListView.builder(
          /// Configure ListView controller
          controller: scrollController,
          itemCount: 20,
          itemBuilder: (BuildContext context, int index) {
            return Card(
              child: Container(
                height: 50.0,
                padding: EdgeInsets.all(16.0),
                child: Text('Item $index'),
              ),
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          scrollController.animateTo(scrollController.position.minScrollExtent,
              duration: Duration(seconds: 2), curve: Curves.ease);
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

Run Code Online (Sandbox Code Playgroud)