2017-06-28 2 views
1

folgendes Problem: Ich habe eine Liste von ExpansionTiles, die sehr gut funktioniert. Das einzige Problem, mit dem ich konfrontiert bin, ist, dass eine expandierte ExpansionTile, die aus der Sicht gescrollt wird, nach dem Zurückscrollen nicht mehr erweitert wird. Dies führt zu einer unerwünschten Benutzererfahrung und auch zu einer Art "nervösem" Scrollen.ExpansionTile nicht Zustand halten

In der Dokumentation folgendes:

Wenn mit Scroll-Widgets wie Listview verwendet wird, muss ein eindeutiger Schlüssel angegeben werden, um die ExpansionTile zu ermöglichen, seine ausgedehnten Zustand zu speichern und wiederherzustellen, wenn es in die und aus der Sicht gescrollt .

Dies funktioniert jedoch nicht. Bis jetzt habe ich keine Möglichkeit gefunden, das zu schaffen.
Hier ist der Code so weit:

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'), 
     ], 
    ); 
    } 
} 

Antwort

0

eine PageStorageKey anstelle eines GlobalKey verwenden.

+0

Danke dafür, funktioniert wie ein Charme. Aber ist das irgendwo dokumentiert? Ich konnte keinen Hinweis auf diese Art von Schlüssel finden ... –

+0

Ich öffnete https://github.com/flutter/flutter/pull/11034, um die Dokumentation zu verbessern. –