Flutter - Collapsing ExpansionTile after choosing an item

后端 未结 6 1397
傲寒
傲寒 2020-11-27 20:04

I\'m trying to get ExpansionTile to collapse after I choose an item, but it does not close the list that was opened.

I tried to use the onExpansio

6条回答
  •  -上瘾入骨i
    2020-11-27 20:46

    solution below would work, but it is quite hacky and might not be the best one:

    
    
        import 'package:flutter/material.dart';
        import 'dart:math';
    
        void main() {
          runApp(new ExpansionTileSample());
        }
    
        class ExpansionTileSample extends StatefulWidget {
          @override
          ExpansionTileSampleState createState() => new ExpansionTileSampleState();
        }
    
        class ExpansionTileSampleState extends State {
          String foos = 'One';
          int _key;
    
          _collapse() {
            int newKey;
            do {
              _key = new Random().nextInt(10000);
            } while(newKey == _key);
          }
    
          @override
          void initState() {
            super.initState();
            _collapse();
          }
    
          @override
          Widget build(BuildContext context) {
            return new MaterialApp(
              home: new Scaffold(
                appBar: new AppBar(
                  title: const Text('ExpansionTile'),
                ),
                body: new ExpansionTile(
                    key: new Key(_key.toString()),
                    initiallyExpanded: false,
                    title: new Text(this.foos),
                    backgroundColor: Theme
                        .of(context)
                        .accentColor
                        .withOpacity(0.025),
                    children: [
                      new ListTile(
                        title: const Text('One'),
                        onTap: () {
                          setState(() {
                            this.foos = 'One';
                            _collapse();
                          });
                        },
                      ),
                      new ListTile(
                        title: const Text('Two'),
                        onTap: () {
                          setState(() {
                            this.foos = 'Two';
                            _collapse();
                          });
                        },
                      ),
                      new ListTile(
                        title: const Text('Three'),
                        onTap: () {
                          setState(() {
                            this.foos = 'Three';
                            _collapse();
                          });
                        },
                      ),
                    ]
                ),
              ),
            );
          }
        }
    
    

    I found that ExpansionTile has initiallyExpanded property, which is the only way to make it collapsed. As property works only initially you want to make ExpansionTile to be recreated everytime build is called. To force it you just assign different key everytime you build it. This might not be best solution performance wise, but ExpansionTile is quite simple, so this should not be a problem.

提交回复
热议问题