Flutter:在共享首选项中保存 ToggleButton 选择

Flutter: Save ToggleButton selection in Shared preferences

我有三个 selection 到 select 字体的 ToggleButton,一次只能接受一个 selection,现在工作正常。但是我的共享偏好问题,我无法保存和获取 selection。这有点令人困惑,因为 selection 的结果是一个布尔值列表,例如 [true, false, false].

我需要你的帮助来修复共享偏好代码,以便我可以保存并获得最终的 selection。

这是我的共享首选项代码:

  void initState() {
    super.initState();
    getisSelectedFont();
    isSelectedFont = [true, false, false];
  }

  saveisSelectedFont(bool value) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      prefs.setBool("isSelectedFont", value);
    });
  }

  getisSelectedFont() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      isSelectedFont =
          (prefs.getBool('isSelectedFont') ?? [true, false, false]);
    });
  }

  List<bool> isSelectedFont;

这是 ToggleButton 的代码:

                            child: ToggleButtons(
                              borderRadius: BorderRadius.circular(6),
                              children: <Widget>[
                                // first toggle button
                                Padding(
                                  padding: const EdgeInsets.only(
                                      right: 15, left: 15),
                                  child: Text(
                                    'font-1',
                                    style: TextStyle(fontSize: 15),
                                  ),
                                ),
                                // second toggle button
                                Padding(
                                  padding: const EdgeInsets.only(
                                      right: 15, left: 15),
                                  child: Text(
                                    'font-2',
                                    style: TextStyle(fontSize: 15),
                                  ),
                                ),
                                // third toggle button
                                Padding(
                                  padding: const EdgeInsets.only(
                                      right: 15, left: 15),
                                  child: Text(
                                    'font-3',
                                    style: TextStyle(fontSize: 15),
                                  ),
                                ),
                              ],
                              // logic for button selection below

                              onPressed: (int index) {
                                setState(() {
                                  for (int i = 0;
                                      i < isSelectedFont.length;
                                      i++) {
                                    isSelectedFont[i] = i == index;
                                  }
                                });

                                print(isSelectedFont);
                              },
                              isSelected: isSelectedFont,
                            ),

改变 saveisSelectedFont , getisSelectedFont 对此

  saveisSelectedFont() async {
   SharedPreferences prefs = await SharedPreferences.getInstance();
   setState(() {
     prefs.setStringList("isSelectedFont",
         isSelectedFont.map((e) => e ? 'true' : 'false').toList());
   });
}




  getisSelectedFont() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      isSelectedFont = (prefs?.getStringList('isSelectedFont')?.map((e) => e == 'true' ? true : false)?.toList() ?? [true, false, false]);
    });
  }
  saveisSelectedFont() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      prefs.setStringList(
        "isSelectedFont",
        isSelectedFont.map((e) => e ? 'true' : 'false').toList(),
      );
    });
  }

  getisSelectedFont() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      isSelectedFont = (prefs
              .getStringList('isSelectedFont')
              ?.map((e) => e == 'true' ? true : false)
              ?.toList() ??
          [true, false, false]);
    });
  }

  onPressed: (int index) {
    setState(() {
      for (int i = 0; i < isSelectedFont.length; i++) {
        isSelectedFont[i] = i == index;
      }
      saveisSelectedFont();
    });
    
  },
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class ToggleButtonTest extends StatefulWidget {
  @override
  _ToggleButtonTestState createState() => _ToggleButtonTestState();
}

class _ToggleButtonTestState extends State<ToggleButtonTest> {
  List<bool> isSelectedFont;
  int _currentFontFamily = 0;
  List<String> _fontFamily = [
    'SansitaSwashed',
    'DancingScript',
    'AmanticSC',
  ];
  void initState() {
    super.initState();
    getisSelectedFont();
    isSelectedFont = [true, false, false];
  }

  saveisSelectedFont() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      prefs.setStringList(
        "isSelectedFont",
        isSelectedFont.map((e) => e ? 'true' : 'false').toList(),
      );
      prefs.setInt('currentFontFamily', _currentFontFamily);
    });
  }

  getisSelectedFont() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      isSelectedFont = (prefs
              .getStringList('isSelectedFont')
              ?.map((e) => e == 'true' ? true : false)
              ?.toList() ??
          [true, false, false]);
      _currentFontFamily = prefs.getInt('currentFontFamily') ?? 0;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Toggle Button Test'),
      ),
      body: Column(
        children: [
          Container(
            margin: EdgeInsets.all(20),
            child: ToggleButtons(
              borderRadius: BorderRadius.circular(6),
              children: <Widget>[
                // first toggle button
                Padding(
                  padding: const EdgeInsets.only(right: 15, left: 15),
                  child: Text(
                    'font-1',
                    style: TextStyle(fontSize: 15),
                  ),
                ),
                // second toggle button
                Padding(
                  padding: const EdgeInsets.only(right: 15, left: 15),
                  child: Text(
                    'font-2',
                    style: TextStyle(fontSize: 15),
                  ),
                ),
                // third toggle button
                Padding(
                  padding: const EdgeInsets.only(right: 15, left: 15),
                  child: Text(
                    'font-3',
                    style: TextStyle(fontSize: 15),
                  ),
                ),
              ],
              // logic for button selection below
              onPressed: (int index) {
                setState(() {
                  for (int i = 0; i < isSelectedFont.length; i++) {
                    isSelectedFont[i] = i == index;
                  }
                  _currentFontFamily = index;
                  saveisSelectedFont();
                });
              },
              isSelected: isSelectedFont,
            ),
          ),
          Expanded(
            child: Center(
              child: Text(
                'This is the answer..',
                style: TextStyle(
                  fontSize: 30,
                  fontFamily: _fontFamily[_currentFontFamily],
                ),
              ),
            ),
          )
        ],
      ),
    );
  }
}