Как изменить заголовок при открытии флаттера панели расширения

#flutter #flutter-layout

Вопрос:

Добрый вечер ),

итак, у меня есть экспансионист внутри экспансиониста. Я хочу, чтобы заголовок менялся при открытии панели списка расширения, но как это сделать?

 return ExpansionPanel(
                headerBuilder: (BuildContext context, bool isExpanded) {
                  return ListTile(
                    title: isExpanded == null?
                    Text('No position found') //code if above statement is true
                        :Text("N"),
                  );
                },
 

Я понял, что мне нужно что-то подобное, но проверенное условие должно быть неправильным, потому что, когда я открываю панель расширения в части ExpansionPanelList, ничего не происходит.

Так что в целом моя структура выглядит так:

ExpansionTile -Панель расширения-Панель расширения

и мне интересно, как я могу узнать, открыта ли панель расширения в списке расширения, и когда у меня будет эта информация, я смогу просто передать ее в условие

Если вы хотите воссоздать: (строка 55 начинается с кода, который я опубликовал выше)

     import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        body: SingleChildScrollView(
          child: ExpansionTile(
            title: Text("Generelles Vorgehen"),
            children: [ExpansionList()],
          ),
        ),
      ),
    );
  }
}

class ExpansionList extends StatefulWidget {
  final Info info;
  const ExpansionList({
    Key key,
    this.info,
  }) : super(key: key);
  @override
  _ExpansionListState createState() => _ExpansionListState();
}

class _ExpansionListState extends State<ExpansionList> {
  Widget _buildListPanel() {
    return ExpansionPanelList(
      expansionCallback: (int index, bool isExpanded) {
        setState(() {
          infos[index].isExpanded = !isExpanded;
        });
      },
      children: infos.map<ExpansionPanel>((Info info) {
        return ExpansionPanel(
            headerBuilder: (BuildContext context, bool isExpanded) {
              return ListTile(
                title: isExpanded == null?
                Text('No position found') //code if above statement is true
                    :Text("N"),
              );
            },
                body:ListView.builder(
                    shrinkWrap: true,
                    itemCount: info.expandedValueData.length,
                    itemBuilder: (context, index) {
                      return CheckboxListTile(
                          title: Text(info.expandedValueData[index].title,
                              style: TextStyle(
                                  decoration:
                                      info.expandedValueData[index].completed
                                          ? TextDecoration.lineThrough
                                          : null)),
                          value: info.expandedValueData[index].completed,
                          onChanged: (value) {
                            setState(() {
// Here you toggle the checked item state
                              infos.firstWhere(
                                  (currentInfo) => info == currentInfo)
                                ..expandedValueData[index].completed = value;
                            });
                          });
                    }),
            isExpanded: info.isExpanded);
      }).toList(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Container(
        child: _buildListPanel(),
      ),
    );
  }
}

class expandedValue {
  int id;
  String title;
  bool completed;

  expandedValue({
    this.id,
    this.title,
    this.completed = false,
  });
}

class Info {
  String headerValue;
  bool isExpanded;
  final List<expandedValue> expandedValueData;

  Info({this.headerValue, this.isExpanded = false, this.expandedValueData});
}

List<Info> infos = [
  Info(
    headerValue: "Außenansicht",
    expandedValueData: <expandedValue>[
      expandedValue(id: 1,  title: "Roststellen"),
      expandedValue(
          id: 2,

          title:
              "Farbunterschiede im Lack, Unregelmäßigkeiten [Problemstellen übermalt]"),
      expandedValue(
          id: 3,
          title: "kleine Kratzer [hinter Karosserie größere Folgeschäden?]"),
      expandedValue(
          id: 4,
          title: "Dichtungen an Scheiben amp; Türen [porös, rissig]"),
      expandedValue(
          id: 5,
          title:
              "Vorallem Windschutzscheibe auf Kratzer untersuchen [Gefahr größerer Rissbildung ]"),
      expandedValue(
          id: 6,
          title:
              "Lampen untersuchen, funktionsfähig? Innen beschlagene Scheinwerfer [Gefahr durch Wasserschaden]"),
      expandedValue(
          id: 7,
          title: "Reifen [Risse o. abgefahrenes Profil?]"),
    ],
  ),
  Info(
    headerValue: "Innenraum",
    expandedValueData: <expandedValue>[
      expandedValue(
          id: 1,
          title: "klappern Türen oder deren Seitenverkleidung beim Schließen?"),
      expandedValue(id: 2,  title: "funktionierende Elektrik"),
      expandedValue(id: 3,  title: "Sitze"),
      expandedValue(id: 4, title: "Rest"),
    ],
  ),
  Info(
    headerValue: "Motorraum",
    expandedValueData: <expandedValue>[
      expandedValue(
          id: 1,
          title:
              "Motor schon vom Verkäufer warmgelaufen? [eventuell sollen Startprobleme vertuscht werden]"),
      expandedValue(
          id: 2,
          title: "Batteriepole angerostet? [Gefahr vorzeitiger Entladung]"),
      expandedValue(
          id: 3,
          title: "Gibt es Öl oder Bremsflüssigkeitsspuren an:"),
      expandedValue(
          id: 4,
          title:
              "Sprudelt Kühlswasser bei laufendem Motor [eventuell Zylinderkopfdichtung defekt]"),
      expandedValue(id: 5, title: "Ölstand prüfen"),
    ],
  ),
  Info(
    headerValue: "Unterboden",
    expandedValueData: <expandedValue>[
      expandedValue(id: 1, title: "Roststellen?"),
      expandedValue(
          id: 2,
          title:
              "neuer Unterbodenschutz? [möglicher Versuch Problemstellen zu verdecken (z.B Schweißnähte etc.)]"),
      expandedValue(
          id: 3,
          title: "sitzt der Auspuff fest, arbeitet der Motor leise?"),
    ],
  ),
  Info(
    headerValue: "Dokumenten- amp; Zahlencheck",
    expandedValueData: <expandedValue>[
      expandedValue(
          id: 1, title: "Reperaturenabrechnungen vorhanden?"),
      expandedValue(
          id: 2,
          title:
              "macht Laufleistung Sinn? Mögliche Lufleistungen im Bereich von über 150 000 km, wenn:"),
      expandedValue(
          id: 3,  title: "Zulassungsbescheinigung Teil 1amp;2 "),
      expandedValue(id: 4,  title: "Wartungen amp; Rechnungen"),
    ],
  ),
  Info(
    headerValue: "Probefahrt",
    expandedValueData: <expandedValue>[
      expandedValue(id: 1,  title: "vor der Fahrt:"),
      expandedValue(id: 2,  title: "bei der Fahrt"),
      expandedValue(id: 3,  title: "nach der Fahrt"),
    ],
  ),
  Info(
    headerValue: "Garantie, Gewehrleistung und Vertrag ",
    expandedValueData: <expandedValue>[
      expandedValue(
          id: 1,
          title:
              "auf Rechmäßigkeit prüfen, wegen Haftungsgründen verweisen wir hier auf andere Seiten, wie die der Allianz oder Cosmosdirekt o. ä. "),
    ],
  ),
];
 

Ответ №1:

Вместо isExpanded == null использования !isExpanded в троичном условии.

Комментарии:

1. Вы имеете в виду -> название: !IsExpanded == null?, это сработало для вас?

2. title: !isExpanded ? Text('No position found') : Text('N'),

3. Да, я имел в виду только первую строку, я попробовал ее, и поведение для меня не изменилось, вы проверили это?

4. Я ничего не говорю !isExpanded == null . Используйте !isExapnded только.

5. О, я так заблудился, мне пора ложиться спать, спасибо за ответ