Stack Overflow на русском Asked by DmIvanov1970 on January 25, 2021
Я недавно начал изучения данного фреймворка, поэтому если что-то говорю неправильно, поправьте пожалуйста. А теперь к вопросу: почему виджет Switch (я использую CupertinoSwitch) не может переключиться из положения off в on? Этот вопрос уже гуглил, но те ответы, которые были, не помогли.
Вот мой код:
CupertinoSwitch(
value: flag1,
onChanged: (bool value) {
setState(() {
flag1 = value;
});
},
)
Пример работы выше указанного кода можно посмотреть тут. То есть, при простом нажатии ничего не происходит, а если удержать саму метку (белый кружок), то перевести м положение on можно, но когда отпускаешь метку, switch переходит в положение off
UPD
Полный код:
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_cupertino_settings/flutter_cupertino_settings.dart';
void main() => runApp(SettingsScreen());
class SettingsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoApp(
home: SettingScreen(),
theme: CupertinoThemeData(primaryColor: CupertinoColors.activeBlue),
);
}
}
class SettingScreen extends StatefulWidget {
@override
State createState() => SettingScreenState();
}
class SettingScreenState extends State<SettingScreen> {
@override
Widget build(BuildContext context) {
bool flag1 = false;
bool flag2 = true;
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Настройки'),
),
child: Scaffold(
body: Container(
child: CupertinoSettings(items: <Widget>[
const CSHeader('Интерфейс'),
CSControl(
nameWidget: Text('Полупрозрачные кнопки'),
contentWidget: CupertinoSwitch(
value: flag1,
onChanged: (bool value) {
setState(() {
flag1 = value;
print(flag1);
});
},
)),
]),
),
),
);
}
}
Использую эту библиотеку для настроек – flutter_cupertino_settings
Ваш код правильный, но по описанию, кажется что у вас где-то в build методе есть переопределение переменной flag1, если это так, то определение стартовых значений переменных в state необходимо делать методе initState офф дока по методу initState
Прикрепите полный код вашего виджета и тогда можно будет указать точную причину.
UPDATE
Вместо того чтобы задавать изначальные значение в build методе как это делается здесь:
Widget build(BuildContext context) {
bool flag1 = false;
bool flag2 = true;
return CupertinoPageScaffold(
Нужно вынести эти переменные в state и переопределить метод initState вот так:
bool flag1;
bool flag2;
@override
void initState() {
super.initState();
flag1 = false;
flag2 = true;
}
дальше в build методе обращаться к ним и перерисовывать как хочется
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Настройки'),
),
child: Scaffold(
body: Container(
child: CupertinoSettings(items: <Widget>[
const CSHeader('Интерфейс'),
CSControl(
nameWidget: Text('Полупрозрачные кнопки'),
contentWidget: CupertinoSwitch(
value: flag1,
onChanged: (bool value) {
setState(() {
flag1 = value;
print(flag1);
});
},
)),
]),
),
),
);
}
Correct answer by Vadim Popov on January 25, 2021
Все работает
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatefulWidget {
@override
State createState() => new MyWidgetState();
}
class MyWidgetState extends State<MyWidget> {
bool flag1 = false;
@override
Widget build(BuildContext context) {
return CupertinoSwitch(
value: flag1,
onChanged: (bool value) {
setState(() {
flag1 = value;
print(flag1);
});
},
);
}
}
Answered by MiT on January 25, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP