【问题标题】:How is PrimaryScrollController used in Flutter?Flutter 中如何使用 PrimaryScrollController?
【发布时间】:2018-08-10 18:33:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • this 可能会帮助你
  • 这有帮助,但有没有办法给 PrimaryScrollController 一个初始偏移量?我希望能够初始化我正在使用的 ScrollController 的属性,但是使用 PrimaryScrollController.of(context) 不允许这样做。有没有使用 PrimaryScrollController 构造函数的示例?
  • 考虑添加minimal reproducible example 让这个问题变得更好

标签: flutter


【解决方案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),
      ),
    );
  }
}

如果使用了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),
      ),
    );
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 2019-09-10
    • 2019-07-29
    • 2021-12-03
    • 2021-04-15
    • 2018-09-15
    • 1970-01-01
    • 2022-07-28
    相关资源
    最近更新 更多