Flutter 根据警报对话框响应更改开关按钮颜色

Flutter 根据警报对话框响应更改开关按钮颜色,flutter,dart,Flutter,Dart,我使用的是一个名为flatter的包,当用户选择取消操作时,我想将按钮的颜色从绿色更改为红色,反之亦然。我可以看到onChange函数中的值发生了变化,但按钮保持不变。因此,如果我单击按钮,然后在警报对话框中选择“否”选项,我希望按钮恢复到原始状态 Widget build(BuildContext context) { final scaffold = Scaffold.of(context); bool isSwitchOn = true; r

我使用的是一个名为flatter的包,当用户选择取消操作时,我想将按钮的颜色从绿色更改为红色,反之亦然。我可以看到onChange函数中的值发生了变化,但按钮保持不变。因此,如果我单击按钮,然后在警报对话框中选择“否”选项,我希望按钮恢复到原始状态

Widget build(BuildContext context) {
    final scaffold = Scaffold.of(context);
    bool isSwitchOn = true;
                return ListTile(
                  leading: Text(widget.title),
                  //title:   ,
                  trailing: Container(
                    width: 200,
                    child: Row(
                      children: <Widget>[
                    SwitcherButton(
                    value:  isSwitchOn,
            onColor: Colors.greenAccent,
            offColor: Colors.redAccent,
            onChange: (value) {
              print(value);
              AwesomeDialog(
                context: context,
                dialogType: DialogType.QUESTION,
                animType: AnimType.TOPSLIDE,
                title: value==true?'Mark item as availeble ?':'Mark item as unavailable?',
                desc:'hello',
                btnCancelOnPress: () {
                     setState(() {
                   isSwitchOn=!value;
                   print('Value after cancel is ' + isSwitchOn.toString());
                });
                },
                btnOkText: "Yes",
                btnCancelText:"No",
                btnOkOnPress: () {
                  setState(() {
                   
                });
                
                },
              )..show();
            },
          ),
           ],
        ),
      ),
    );
   }
小部件构建(构建上下文){
最终脚手架=脚手架(上下文);
bool-isSwitchOn=true;
返回列表块(
前导:文本(widget.title),
//标题:,
拖尾:集装箱(
宽度:200,
孩子:排(
儿童:[
开关按钮(
值:isSwitchOn,
onColor:Colors.greenAccent,
offColor:Colors.redAccent,
onChange:(值){
印刷品(价值);
令人敬畏的对话(
上下文:上下文,
dialogType:dialogType.QUESTION,
animType:animType.TOPSLIDE,
标题:value==true?“将项目标记为可用?”:“将项目标记为不可用”,
描述:你好,
BTNCELONPRESS:(){
设置状态(){
isSwitchOn=!值;
打印('取消后的值为'+isSwitchOn.toString());
});
},
btnOkText:“是”,
btnCancelText:“否”,
btnOkOnPress:(){
设置状态(){
});
},
)…显示();
},
),
],
),
),
);
}
以下是用于视觉目的的屏幕截图。当我从绿色切换到红色时,会出现一个警报对话框,其中有两个选项:是和否。如果我单击否,则切换按钮应保持绿色。换句话说,它应该回到它的原始价值


bool isSwitchOn在每次调用build函数时都设置为true,正如您在build方法中声明的那样。
在build方法(类中的实例变量)之外声明bool isSwitchOn。

您可以复制下面的粘贴运行完整代码
步骤1:移动
bool-isSwitchOn=true外部
构建

第二步:
SwitcherButton
使用
UniqueKey()

SwitcherButton(
          key: UniqueKey(),
第三步:
btnOkOnPress
set
isSwitchOn

btnOkOnPress: () {
            setState(() {
              isSwitchOn = value;
            });
          },
工作演示

完整代码

import 'package:awesome_dialog/awesome_dialog.dart';
import 'package:flutter/material.dart';
import 'package:switcher_button/switcher_button.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class CustomSwitch extends StatefulWidget {
  final String title;

  CustomSwitch({this.title});
  @override
  _CustomSwitchState createState() => _CustomSwitchState();
}

class _CustomSwitchState extends State<CustomSwitch> {
  bool isSwitchOn = true;

  @override
  Widget build(BuildContext context) {
    return ListTile(
      leading: Text(widget.title),
      //title:   ,
      trailing: Container(
        width: 200,
        child: Row(
          children: <Widget>[
            SwitcherButton(
              key: UniqueKey(),
              value: isSwitchOn,
              onColor: Colors.greenAccent,
              offColor: Colors.redAccent,
              onChange: (value) {
                print(value);
                AwesomeDialog(
                  context: context,
                  dialogType: DialogType.QUESTION,
                  animType: AnimType.TOPSLIDE,
                  title: value == true
                      ? 'Mark item as availeble ?'
                      : 'Mark item as unavailable?',
                  desc: 'hello',
                  btnCancelOnPress: () {
                    setState(() {
                      isSwitchOn = !value;
                      print('Value after cancel is ' + isSwitchOn.toString());
                    });
                  },
                  btnOkText: "Yes",
                  btnCancelText: "No",
                  btnOkOnPress: () {
                    setState(() {
                      isSwitchOn = value;
                    });
                  },
                )..show();
              },
            ),
          ],
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            CustomSwitch(title: "Chicken Burger"),
          ],
        ),
      ),
    );
  }
}
import'package:awesome_dialog/awesome_dialog.dart';
进口“包装:颤振/材料.省道”;
导入“包:切换器按钮/切换器按钮.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类CustomSwitch扩展StatefulWidget{
最后的字符串标题;
CustomSwitch({this.title});
@凌驾
_CustomSwitchState createState()=>\u CustomSwitchState();
}
类_CustomSwitchState扩展状态{
bool-isSwitchOn=true;
@凌驾
小部件构建(构建上下文){
返回列表块(
前导:文本(widget.title),
//标题:,
拖尾:集装箱(
宽度:200,
孩子:排(
儿童:[
开关按钮(
键:UniqueKey(),
值:isSwitchOn,
onColor:Colors.greenAccent,
offColor:Colors.redAccent,
onChange:(值){
印刷品(价值);
令人敬畏的对话(
上下文:上下文,
dialogType:dialogType.QUESTION,
animType:animType.TOPSLIDE,
标题:value==true
“将项目标记为可用?”
:“将项目标记为不可用?”,
描述:“你好”,
BTNCELONPRESS:(){
设置状态(){
isSwitchOn=!值;
打印('取消后的值为'+isSwitchOn.toString());
});
},
btnOkText:“是”,
btnCancelText:“否”,
btnOkOnPress:(){
设置状态(){
isSwitchOn=值;
});
},
)…显示();
},
),
],
),
),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
CustomSwitch(标题:“鸡肉汉堡”),
],
),
),
);
}
}

请查看我的最新问题。我不是在寻找警报对话框功能。我想改变开关按钮的状态。不,它不会改变颜色。我试过这个,但它仍然不会改变开关按钮。