簡體   English   中英

更改顫振選項卡時如何保持切換開關狀態?

[英]How to perserve toggle switch state when changing tabs for flutter?

我正在構建我通過 Scaffold 和 TabViewer 顯示的三頁警報(存儲在不同的列表中)。 每個警報都存儲為一行,並帶有一個切換開關以啟用它。 每個頁面的行存儲為一個列表。 盡管在更改值時確保使用 set state,甚至嘗試分配唯一鍵,但我似乎沒有在更改選項卡時保留開關的狀態。

這是我第一次在 Flutter/Dart 中編碼或設計移動應用程序。 因此,我仍在學習這種語言的一些基本功能。

我嘗試使用 Uniquekey() 向所有內容添加密鑰以生成密鑰不起作用,因此我已將其刪除。 我已確保所有變量更改都在設置狀態函數內。 我試圖將變量存儲在 AlarmToggle 的不可變超類中,這既不明智又不起作用。

我並沒有厭倦使用 PageStorageKey,因為我不確定如何在我的代碼中實現它們,但我覺得這可能是唯一的解決方案。

class Alarms {
  List<Widget> allAlarms = []; // Store all alarms for the object

  buildAlarm(
      GlobalKey<ScaffoldState>
          pageKey,
      [int hour,
      int minute,
      List<bool> alarmDaysOfWeek]) {

    TimeOfDay alarmTime = TimeOfDay(hour: hour, minute: minute);
    AlarmRow _newAlarm = new AlarmRow(UniqueKey(), alarmTime, alarmDaysOfWeek);
    allAlarms.add(_newAlarm);
  }
  void removeAlarm(GlobalKey<ScaffoldState> pageKey) {allAlarms.removeLast();}}

class AlarmRow extends StatefulWidget {
  final TimeOfDay _alarmTime;
  final List<bool> _alarmDaysofWeek;
  final UniqueKey key;
  AlarmRow(this.key, this._alarmTime, this._alarmDaysofWeek);
  AlarmRowState createState() => new AlarmRowState();
}

class AlarmRowState extends State<AlarmRow> {
  bool _alarmIsActive;

  AlarmRowState(){_alarmIsActive = _alarmIsActive ?? false;}

  void toggleChanged(bool state) {this.setState(() {_alarmIsActive = state;});}

  @override
  Widget build(BuildContext context) {
    return new Container(
      child: Row(
        children: <Widget>[
          new AlarmIcon(_alarmIsActive),
          new Column(
            children: <Widget>[
              new AlarmTime(widget._alarmTime),
              new AlarmWeekly(widget._alarmDaysofWeek),
            ],
          ),
          new AlarmToggle(
            _alarmIsActive,
            () => toggleChanged(!_alarmIsActive),
          ),
        ],
      ),
    );
  } // Build
} // Class

無論我如何嘗試,每次更改選項卡時,AlarmRow() 中的 _alarmIsActive 變量都會重置為 null。 我試圖在更改頁面時保留其狀態。

解決方案正如 jdv 所說的使用AutomaticKeepAliveClientMixin ,它不難使用,但我想我會在此處包含我在搜索后找到的說明,以防萬一有人搜索並找到它並且不知道如何像我自己一樣自動實現它。

class AlarmRowState extends State<AlarmRow> with AutomaticKeepAliveClientMixin {
    @override bool get wantKeepAlive => true;

它是在 state 類中實現的,帶有您想要保留的任何可修改變量。 'extends' 后面的 'with' 添加了一個 Mixin,它是一種類繼承。 最后,它要求您將 'wantKeepAlive' 設置為 true 並且它會編譯並且在未呈現小部件時不再丟失狀態。

為什么有狀態小部件在未呈現時會丟失狀態是我仍在尋找的東西。 但至少我有一個解決方案。

我希望這會幫助你@Ender! 檢查此代碼,您可以創建一個全局共享首選項並使用它,如下所示:-

class AlarmRow extends StatefulWidget {

  @override
  State<StatefulWidget> createState() => new _AlarmRowState();
}

class _AlarmRowState extends State<AlarmRow>{
  bool alarmIsActive;
  @override
  void initState() {
    alarmIsActive = Global.shared.alarmIsActive;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    ....
.....
....
....
      body: new Container(
        child:  Switch(
          value: alarmIsActive,
          onChanged: (bool isEnabled) {

            setState(() {
             alarmIsActive = isEnabled;
             Global.shared.alarmIsActive = isEnabled;
             isEnabled =!isEnabled;
            });
          },
         .....
......
        ),
      ),
    );
  }
}
class Global{
  static final shared =Global();
  bool alarmIsActive = false;
}

開關已啟用並將保持其狀態

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM