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],
),
),
),
)
],
),
);
}
}
我有三个 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],
),
),
),
)
],
),
);
}
}