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



我有ToggleButton,它有三个选择来选择字体,一次只能接受一个选择,现在运行良好。但我的问题是共享偏好,我无法保存和获得选择。这有点令人困惑,因为选择的结果是一个bools列表,例如[true,false,false]。

我需要你的帮助,请修复共享的首选项代码,这样我就可以保存并获得最终选择。

这是我的共享偏好代码:

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;

这是切换按钮的代码:

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,
),
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],
),
),
),
)
],
),
);
}
}

更改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();
});

},

最新更新