Flutter:使用共享首选项并为变量设置最小值和最大值
Flutter: Using Shared Preferences and set min and max value for a variable
我正在使用一个名为“int _progs1 = 0;”的变量。我可以使用“if 语句”将此变量设置为最大值和最小值,它不会超过或低于指定值。
int _progs1 = 0;
TextButton(
onPressed: () {
if (_progs1 < 3)
setState(() {
_progs1 += 1;
});
debugPrint(' $_progs1 Up');
},
TextButton(
onPressed: () {
if (_progs1 > 0)
setState(() {
_progs1 -= 1;
});
debugPrint(' $_progs1 Down');
},
尝试对共享首选项使用相同的方法来存储它给我的错误值。
“未为类型 'Future' 定义运算符“<”。尝试定义运算符“<”。“
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
Future<int> _progs1;
Future<void> _decrementProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = (prefs.getInt('progs1') ?? 0) - 1;
if (_progs1 < 3)
setState(() {
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
});
});
}
我做错了什么?我的方法错了吗?有更好的方法吗?能够使用定义值之间的变量上下移动并同时存储它。
提前致谢
只需使用简单的 int _progs1;
出现错误是因为您将 int 用于 future 并且您不能对 futures 执行逻辑运算符,因为它们的值是未知的。
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
int _progs1;
Future<void> _decrementProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = await ((prefs.getInt('progs1') ?? 0) - 1);
if (_progs1 < 3)
{
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
});
}
}
您也不需要 setState。当你想使用函数 _decrementProgS1()
时,请使用 await ,如下所示:
_progs1 = await _decrementProgS1()
感谢 Huthaifa 的帮助。我尝试了您的建议,并且编译没有错误。不幸的是,当我 运行 应用程序按下按钮时出现异常错误。
我尝试在屏幕上设置 3 个按钮来更改 0 和 3 之间的值。按钮 1 向上,按钮 2 向下,按钮 3 置零。
下面的代码是我保存值但没有设置值的最大值和最小值的代码。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class MyTest5Body extends StatefulWidget {
@override
_MyTest5BodyState createState() => _MyTest5BodyState();
}
class _MyTest5BodyState extends State<MyTest5Body> {
final scaffoldKey = GlobalKey<ScaffoldState>();
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
Future<int> _progs1;
Future<void> _incrementProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = (prefs.getInt('progs1') ?? 0) + 1;
setState(() {
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
}) ;
});
}
Future<void> _decrementProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = 0;
setState(() {
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
}) ;
});
}
Future<void> _resetProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = 0;
setState(() {
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
}) ;
});
}
@override
void initState() {
super.initState();
_progs1 = _prefs.then((SharedPreferences prefs) {
return (prefs.getInt('progs1') ?? 0);
}) ;
}
@override
Widget build(BuildContext context) {
return CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildListDelegate(
[
// Program Auswahl-------------------------------------------
Container(
height: 50.0,
child: Row(children: <Widget>[
Container(
margin: const EdgeInsets.all(0),
child: TextButton(
onPressed: _incrementProgS1,
child: const Icon(Icons.arrow_upward, size: 30.0),
style: TextButton.styleFrom(
primary: Colors.orangeAccent[400],
),
),
),
Container(
margin: const EdgeInsets.all(0),
child: TextButton(
onPressed: _decrementProgS1,
child: const Icon(Icons.arrow_downward, size: 30.0),
style: TextButton.styleFrom(
primary: Colors.greenAccent[700]),
)),
Container(
margin: const EdgeInsets.all(0),
child: TextButton(
onPressed: _resetProgS1,
child: const Icon(Icons.restore, size: 30.0),
style: TextButton.styleFrom(primary: Colors.blue[700]),
)),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 5.0, vertical: 5.0),
child: FutureBuilder<int>(
future: _progs1,
builder: (BuildContext context,
AsyncSnapshot<int> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return const CircularProgressIndicator();
default:
return Text(
'${snapshot.data} Program ',
style: TextStyle(
fontSize: 25.0,
fontWeight: FontWeight.bold,
letterSpacing: 2.0,
color: Colors.blueGrey[500],
),
);
}
})),
]),
),
],
),
),
],
);
}
}
我正在使用一个名为“int _progs1 = 0;”的变量。我可以使用“if 语句”将此变量设置为最大值和最小值,它不会超过或低于指定值。
int _progs1 = 0;
TextButton(
onPressed: () {
if (_progs1 < 3)
setState(() {
_progs1 += 1;
});
debugPrint(' $_progs1 Up');
},
TextButton(
onPressed: () {
if (_progs1 > 0)
setState(() {
_progs1 -= 1;
});
debugPrint(' $_progs1 Down');
},
尝试对共享首选项使用相同的方法来存储它给我的错误值。
“未为类型 'Future' 定义运算符“<”。尝试定义运算符“<”。“
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
Future<int> _progs1;
Future<void> _decrementProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = (prefs.getInt('progs1') ?? 0) - 1;
if (_progs1 < 3)
setState(() {
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
});
});
}
我做错了什么?我的方法错了吗?有更好的方法吗?能够使用定义值之间的变量上下移动并同时存储它。
提前致谢
只需使用简单的 int _progs1;
出现错误是因为您将 int 用于 future 并且您不能对 futures 执行逻辑运算符,因为它们的值是未知的。
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
int _progs1;
Future<void> _decrementProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = await ((prefs.getInt('progs1') ?? 0) - 1);
if (_progs1 < 3)
{
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
});
}
}
您也不需要 setState。当你想使用函数 _decrementProgS1()
时,请使用 await ,如下所示:
_progs1 = await _decrementProgS1()
感谢 Huthaifa 的帮助。我尝试了您的建议,并且编译没有错误。不幸的是,当我 运行 应用程序按下按钮时出现异常错误。
我尝试在屏幕上设置 3 个按钮来更改 0 和 3 之间的值。按钮 1 向上,按钮 2 向下,按钮 3 置零。
下面的代码是我保存值但没有设置值的最大值和最小值的代码。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class MyTest5Body extends StatefulWidget {
@override
_MyTest5BodyState createState() => _MyTest5BodyState();
}
class _MyTest5BodyState extends State<MyTest5Body> {
final scaffoldKey = GlobalKey<ScaffoldState>();
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
Future<int> _progs1;
Future<void> _incrementProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = (prefs.getInt('progs1') ?? 0) + 1;
setState(() {
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
}) ;
});
}
Future<void> _decrementProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = 0;
setState(() {
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
}) ;
});
}
Future<void> _resetProgS1() async {
final SharedPreferences prefs = await _prefs;
final int progs1 = 0;
setState(() {
_progs1 = prefs.setInt("progs1", progs1).then((bool success) {
return progs1;
}) ;
});
}
@override
void initState() {
super.initState();
_progs1 = _prefs.then((SharedPreferences prefs) {
return (prefs.getInt('progs1') ?? 0);
}) ;
}
@override
Widget build(BuildContext context) {
return CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildListDelegate(
[
// Program Auswahl-------------------------------------------
Container(
height: 50.0,
child: Row(children: <Widget>[
Container(
margin: const EdgeInsets.all(0),
child: TextButton(
onPressed: _incrementProgS1,
child: const Icon(Icons.arrow_upward, size: 30.0),
style: TextButton.styleFrom(
primary: Colors.orangeAccent[400],
),
),
),
Container(
margin: const EdgeInsets.all(0),
child: TextButton(
onPressed: _decrementProgS1,
child: const Icon(Icons.arrow_downward, size: 30.0),
style: TextButton.styleFrom(
primary: Colors.greenAccent[700]),
)),
Container(
margin: const EdgeInsets.all(0),
child: TextButton(
onPressed: _resetProgS1,
child: const Icon(Icons.restore, size: 30.0),
style: TextButton.styleFrom(primary: Colors.blue[700]),
)),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 5.0, vertical: 5.0),
child: FutureBuilder<int>(
future: _progs1,
builder: (BuildContext context,
AsyncSnapshot<int> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return const CircularProgressIndicator();
default:
return Text(
'${snapshot.data} Program ',
style: TextStyle(
fontSize: 25.0,
fontWeight: FontWeight.bold,
letterSpacing: 2.0,
color: Colors.blueGrey[500],
),
);
}
})),
]),
),
],
),
),
],
);
}
}