【问题标题】:Flutter ListView performance issues with PageStorageKeyPageStorageKey 的 Flutter ListView 性能问题
【发布时间】:2020-08-27 14:00:47
【问题描述】:

我有一个包含两个 ListView 的 TabBar - 每个都有 250 个项目。我为每个 ListView 使用 PageStorageKey 以在视图之间切换时保留滚动位置。

如果我最初在滚动位置没有太大变化时在选项卡之间切换 - 比如在列表的开头,则在选项卡之间切换是清晰而快速的。

但是,如果我滚动到每个列表的末尾并在两个选项卡之间切换,那么在实际显示列表之前会有明显的延迟。

我能做些什么来提高这里的性能吗?

见:https://gist.github.com/kungfuslippers/fcae96675fb76c10f7bb5051b66ed87e

或以下代码:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp(
      itemsA: List<String>.generate(250, (i) => "Item $i"),
      itemsB: List<String>.generate(250, (i) => "Item $i")));
}

class MyApp extends StatefulWidget {
  final List<String> itemsA;
  final List<String> itemsB;

  MyApp({Key key, @required this.itemsA, this.itemsB}) : super(key: key);

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

class MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
  TabController _tabController;

  final Key listKeyA = PageStorageKey('listA');
  final Key listKeyB = PageStorageKey('listB');


  @override
  void initState() {
    super.initState();
    _tabController = TabController(vsync: this, length: 2);
  }

  @override
  Widget build(BuildContext context) {
    final title = 'Long List';

    return MaterialApp(
        title: title,
        home: Scaffold(
          appBar: AppBar(
            title: Text(title),
          ),
          body: TabBarView(controller: _tabController, children: [
            ListWidget(key: listKeyA, items: widget.itemsA),
            ListWidget(key: listKeyB, items: widget.itemsB),
          ]),
          bottomNavigationBar: Container(
            color: Colors.blue,
            child: TabBar(
              controller: _tabController,
              indicatorColor: Colors.white,
              tabs: <Widget>[Tab(text: "ListA"), Tab(text: "ListB")],
            ),
          ),
        ));
  }
}

class ListWidget extends StatefulWidget {
  final List<String> items;

  const ListWidget({
    Key key,
    @required this.items,
  }) : super(key: key);

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

class ListWidgetState extends State<ListWidget> {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: widget.items.length,
      itemBuilder: (context, index) {
        return ListTile(
          title: Text('${widget.items[index]}'),
        );
      },
    );
  }
}

【问题讨论】:

    标签: android ios performance flutter flutter-animation


    【解决方案1】:

    如果您的所有 ListView 孩子的高度都相同,则 ListView 有一个名为 itemExtent 的属性,您可以将孩子的高度指定为双倍。这将大大提高您的滚动性能。

    如果您的 ListView 子项的高度不同,那么您无能为力,但如果您在调试模式下进行测试,请改为在发布模式下尝试。与发布模式相比,调试模式下的滚动行为是日志滞后。

    【讨论】:

    • 这个问题与滚动性能无关。滚动非常流畅。选择包含一长串项目的选项卡与实际出现的项目列表之间存在延迟/延迟。
    • @kungfuslippers 使用 PageStorageKey 时,它必须将所有子级布局到滚动位置。这就是为什么在大量滚动时渲染它时遇到问题的原因。我的回答将解决这个问题。你试过了吗?
    • 是的,你说得对,它大大提高了性能。非常感谢。
    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2020-12-30
    • 2020-11-09
    • 2012-02-28
    相关资源
    最近更新 更多