具有共享偏好的Flutter Switch在第一次更改时不起作用



我需要另一个文件中的开关值(true或false(的信息来计算一些东西。当Switch为false,我重新启动应用程序时,Switch仍为false,如果我单击它,值将变为true,并使用它执行计算。

现在我的问题是:如果我打开开关true并关闭应用程序并重新启动,该值将保持true(这很好(,但如果我现在单击开关,则第二个文件中的值应为false,但它没有,因此计算没有使用此false。再点击开关2次后,它就可以完美工作了。

你有什么改变的想法吗?我会非常感激的!

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:ncrechner/Allgemein/state_widget.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
class Test extends StatefulWidget {
@override
DienstState createState() => DienstState();
}
@override
class DienstState extends State<Test> {
Widget build(BuildContext context) {
return DienstSwitch();
}
}
class SwitchHelper with ChangeNotifier{
bool _switchValue;
final SharedPreferences prefs = SharedPreferences.getInstance();

updataValue() async{
_switchValue = await prefs.getBool("isSwitchedDienst1");
_switchValue = !_switchValue;
prefs.setBool("isSwitchedDienst1", _switchValue);
notifyListeners();
}
}
class DienstSwitch extends StatefulWidget {
@override
DienstSwitchState createState() => new DienstSwitchState();
}
bool isSwitchedDienst1 = false;
class DienstSwitchState extends State<DienstSwitch> {
@override
void initState() {
super.initState();
loadisSwitchedDienst();
}
loadisSwitchedDienst() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
isSwitchedDienst1 =
(prefs.getBool("isSwitchedDienst1") ?? isSwitchedDienst1);
}
incrementisSwitchedDienst() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
isSwitchedDienst1 =
(prefs.getBool('isSwitchedDienst1') ?? isSwitchedDienst1);
prefs.setBool(("isSwitchedDienst1"), isSwitchedDienst1);
});
}
removeisSwitchedDienst() async {
final prefs = await SharedPreferences.getInstance();
prefs.remove('isSwitchedDienst1');
}
@override
Widget build(BuildContext context) {
return CupertinoSwitch(
value: isSwitchedDienst1,
onChanged: (bool value) {
Provider.of<SwitchHelper>(context).updataValue();
//removeisSwitchedDienst();
//incrementisSwitchedDienst();
/*setState(
() {
isSwitchedDienst1 = value;
//final provider = StateInheritedWidget.of(context);
//provider.changeSwitchDienst(isSwitchedDienst1);
},
);*/
},
activeColor: Colors.green,
);
}
}

我的主要内容是:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:ncrechner/DreamOn/Angaben/test.dart';
import 'package:ncrechner/nav.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'Allgemein/state_widget.dart';
import 'onboarding.dart';
int initScreen;
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance();
initScreen = prefs.getInt("initScreen");
await prefs.setInt("initScreen", 1);
await SystemChrome.setPreferredOrientations(
[
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
],
);
runApp(MyApp());
}
/*class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) => StateWidget(
child: Builder(
builder: (context) {
return
*/
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [ChangeNotifierProvider(create: (context) => SwitchHelper())],
child: MaterialApp(
initialRoute: initScreen == 0 || initScreen == null ? "first" : "/",
routes: {
"/": (context) => Navigation(),
"first": (context) => OnBoardingPage(),
},
theme: ThemeData(
primaryColor: Colors.white,
scaffoldBackgroundColor: Colors.white.withAlpha(150),
accentColor: Colors.blue,
backgroundColor: Colors.red,
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
onPrimary: Colors.black,
primary: Colors.white,
),
),
toggleButtonsTheme: ToggleButtonsThemeData(
color: Colors.black,
selectedColor: Colors.black,
fillColor: Colors.blue.withOpacity(0.4)),
),
darkTheme: ThemeData(
brightness: Brightness.dark,
primarySwatch: Colors.blue,
primaryColor: Colors.grey[900],
buttonColor: Colors.grey[900],
scaffoldBackgroundColor: Colors.black,
accentColor: Colors.blue,
),
themeMode: ThemeMode.system,
/* ThemeMode.system to follow system theme, 
ThemeMode.light for light theme, 
ThemeMode.dark for dark theme
*/
debugShowCheckedModeBanner: false,
),
);
}
}

我认为setState((没有按照您的指示工作。我也是新来的扑腾。但我认为,如果您使用提供商,它将解决您的问题。

按照这个顺序,您需要创建一个新类。

class SwitchHelper with ChangeNotifier{
bool_switchValue;
final SharedPreferences prefs = SharedPreferences.getInstance();

updataValue() async{
_switchValue = await prefs.getBool("isSwitchedDienst1");
_switchValue = !_switchValue;
prefs.setBool("isSwitchedDienst1", _switchValue);
notifyListeners();
}
}

所以基本上,它将从CCD_ 1中获得值,然后将其存储在变量中。方法updateValue将在点击开关或您的按钮时调用。一旦调用该方法,它将更改bool变量的值,并将其值设置为sharedPreferences。如果bool _switchValue的前一个值为true,则使用条件_switchValue = !_switchValue将其设置为false,反之亦然,然后将其反映到sharedPreferences中。

为了使用这些值,您需要导入包";提供者";https://pub.dev/packages/provider请参阅文档。

将您的材料应用程序与提供商打包。并创建一个CCD_ 6并将子节点分配为CCD_。并创建参数create : (context) => SwitchHelper()

像这样。您可以在GestureDetectorSharedPrefernces0方法中访问方法,以任意方式为准。如:Provider.of<SwitchHelper>(context).updateValue();

我想这会奏效的。

编辑:您的主要方法:

void main(){
runApp(MyApp());}
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: 
[ 
ChangeNotifierProvider(
create: (context)=> SwitchHelper())]
child: MaterialApp()...

假设您想在单击按钮时更改开关。

ElevatedButton(
child: Text("click to switch"),
onPressed: (){
Provider.of<SwitchHelper>(context).updateValue();
}
),

通过这种方式,您可以调用提供程序行,该行将访问该函数并更新ui,而无需使用setState((。

相关内容

  • 没有找到相关文章

最新更新