首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤动:将ToggleButton选择保存在共享首选项中

颤动:将ToggleButton选择保存在共享首选项中
EN

Stack Overflow用户
提问于 2020-11-07 18:59:37
回答 3查看 394关注 0票数 0

我有三个选择字体的ToggleButton,一次只能选择一个字体,现在工作得很好。但我的问题是共享偏好,我无法保存和获取选择。它有点混乱,因为选择的结果是一个布尔列表,例如true、false、false。

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

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

代码语言:javascript
复制
  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的代码:

代码语言:javascript
复制
                            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,
                            ),
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-07 23:29:08

代码语言:javascript
复制
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],
                ),
              ),
            ),
          )
        ],
      ),
    );
  }
}
票数 1
EN

Stack Overflow用户

发布于 2020-11-07 19:49:05

将saveisSelectedFont,getisSelectedFont更改为此

代码语言:javascript
复制
  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]);
    });
  }
票数 1
EN

Stack Overflow用户

发布于 2020-11-07 20:08:34

代码语言:javascript
复制
  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();
    });
    
  },
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64726962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档