代码之家  ›  专栏  ›  技术社区  ›  Rainer Wittmann

ExpansionFile不保持状态

  •  2
  • Rainer Wittmann  · 技术社区  · 8 年前

    以下问题: 我有一份 ExpansionTiles 这很有效。我面临的唯一问题是,一个从视图中滚出来的扩展文件在再次滚动到视图中后,将不再被扩展。这会导致不想要的用户体验,也会导致一种“跳跃式”滚动。

    当与ListView之类的滚动小部件一起使用时,必须指定一个唯一键,以使扩展文件在视图中滚动时能够保存和恢复其扩展状态。


    以下是目前为止的代码:

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(new MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'ExpansionTile Test',
          home: new MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => new _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      List<Widget> _getChildren() {
        List<Widget> elements = [];
        for (int i = 0; i < 20; i++) {
          elements.add(new ListChild());
        }
        return elements;
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text('ExpansionTile Test'),
          ),
          body: new ListView(
            children: _getChildren(),
          ),
        );
      }
    }
    
    class ListChild extends StatefulWidget {
      @override
      State createState() => new ListChildState();
    }
    
    class ListChildState extends State<ListChild> {
      GlobalKey<ListChildState> _key = new GlobalKey();
      @override
      Widget build(BuildContext context) {
        return new ExpansionTile(
          key: _key,
          title: const Text('Test Tile'),
          children: <Widget>[
            const Text('body'),
          ],
        );
      }
    }
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Collin Jackson    8 年前

    使用 PageStorageKey 而不是 GlobalKey