TransWikia.com

Не сохраняется положение Switch, Flutter

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

2 Answers

Ваш код правильный, но по описанию, кажется что у вас где-то в 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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP