Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio 我如何使开关在单击时具有自己的无状态小部件类切换?_Android Studio_Flutter_Dart_Uiswitch_Statefulwidget - Fatal编程技术网

Android studio 我如何使开关在单击时具有自己的无状态小部件类切换?

Android studio 我如何使开关在单击时具有自己的无状态小部件类切换?,android-studio,flutter,dart,uiswitch,statefulwidget,Android Studio,Flutter,Dart,Uiswitch,Statefulwidget,我试图使两个开关在单击时在打开和关闭之间切换。我为交换机的设计创建了一个无状态小部件类。但是,当我使用它并在用户界面类中调用该类时,开关的状态不会改变。如何更新代码以允许更改 import 'package:flutter/material.dart'; class NotificationItem extends StatelessWidget { NotificationItem( {@required this.title, @required this.pu

我试图使两个开关在单击时在打开和关闭之间切换。我为交换机的设计创建了一个无状态小部件类。但是,当我使用它并在用户界面类中调用该类时,开关的状态不会改变。如何更新代码以允许更改

import 'package:flutter/material.dart';

class NotificationItem extends StatelessWidget {
  NotificationItem(
      {@required this.title,
      @required this.pushStatus,
      @required this.emailStatus});

  String title;
  bool pushStatus;
  bool emailStatus;

  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        Expanded(
          child: Padding(
            padding: EdgeInsets.all(20),
            child: Text(
              title,
              style: TextStyle(
                  fontFamily: kFontFamilyNormal,
                  fontSize: 17,
                  color: AppColor.text,
                  fontWeight: FontWeight.w500),
            ),
          ),
        ),
        Expanded(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              Switch(
                value: emailStatus,
                onChanged: (value) {
                  emailStatus = value;
                  print(emailStatus);
                },
                activeTrackColor: AppColor.primaryColorDark,
                activeColor: AppColor.white,
              ),
              Switch(
                value: pushStatus,
                onChanged: (value) {
                  pushStatus = value;
                  print(pushStatus);
                },
                activeTrackColor: AppColor.primaryColorDark,
                activeColor: AppColor.white,
              ),
            ],
          ),
        ),
      ],
    );
  }
}

要更改UI状态,必须使用stateful小部件 您可以将
NotificationItem
转换为
StatefulWidget
或将每个开关提取为其自己的StatefulWidget

或者我建议您使用或查看MVVM模式

您的Get代码如下所示:

导入“包装:颤振/材料.省道”;
导入“package:get/get.dart”;
类NotificationItemViewModel扩展了GetxController{
bool-pushStatus=false;
bool emailStatus=false;
无效更改电子邮件状态(bool newValue){
emailStatus=newValue;
打印(电子邮件状态);
更新();
}
无效更改状态(布尔新值){
pushStatus=newValue;
打印(推送状态);
更新();
}
}
类NotificationItem扩展了无状态小部件{
const NotificationItem({@required this.title});
最后的字符串标题;
@凌驾
小部件构建(构建上下文){
返回GetBuilder(
init:NotificationItemViewModel(),
建筑商:(模型){
返回行(
儿童:[
扩大(
孩子:填充(
填充:常数边集。全部(20),
子:文本(
标题
样式:TextStyle(
fontFamily:kFontFamilyNormal,
尺寸:17,
颜色:AppColor.text,
fontWeight:fontWeight.w500,
),
),
),
),
扩大(
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
开关(
值:model.emailStatus,
一旦更改:model.changeMailStatus,
activeTrackColor:AppColor.primaryColorDark,
activeColor:AppColor.white,
),
开关(
值:model.pushStatus,
一旦更改:model.changePushStatus,
activeTrackColor:AppColor.primaryColorDark,
activeColor:AppColor.white,
),
],
),
),
],
);
},
);
}
}

要更改UI状态,必须使用stateful小部件 您可以将
NotificationItem
转换为
StatefulWidget
或将每个开关提取为其自己的StatefulWidget

或者我建议您使用或查看MVVM模式

您的Get代码如下所示:

导入“包装:颤振/材料.省道”;
导入“package:get/get.dart”;
类NotificationItemViewModel扩展了GetxController{
bool-pushStatus=false;
bool emailStatus=false;
无效更改电子邮件状态(bool newValue){
emailStatus=newValue;
打印(电子邮件状态);
更新();
}
无效更改状态(布尔新值){
pushStatus=newValue;
打印(推送状态);
更新();
}
}
类NotificationItem扩展了无状态小部件{
const NotificationItem({@required this.title});
最后的字符串标题;
@凌驾
小部件构建(构建上下文){
返回GetBuilder(
init:NotificationItemViewModel(),
建筑商:(模型){
返回行(
儿童:[
扩大(
孩子:填充(
填充:常数边集。全部(20),
子:文本(
标题
样式:TextStyle(
fontFamily:kFontFamilyNormal,
尺寸:17,
颜色:AppColor.text,
fontWeight:fontWeight.w500,
),
),
),
),
扩大(
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
开关(
值:model.emailStatus,
一旦更改:model.changeMailStatus,
activeTrackColor:AppColor.primaryColorDark,
activeColor:AppColor.white,
),
开关(
值:model.pushStatus,
一旦更改:model.changePushStatus,
activeTrackColor:AppColor.primaryColorDark,
activeColor:AppColor.white,
),
],
),
),
],
);
},
);
}
}

因为您正在更改状态,所以它必须是一个StatefulWidget。像这样:

class NotificationItem extends StatefulWidget {
  const NotificationItem({
    Key key,
    @required this.title,
    @required this.pushStatus,
    @required this.emailStatus,
  });
  final String title;
  final bool pushStatus;
  final bool emailStatus;

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

class _NotificationItemState extends State<NotificationItem> {
  String _title;
  bool _pushStatus;
  bool _emailStatus;
  
  void initState() {
    super.initState();
    _title = widget.title;
    _pushStatus = widget.pushStatus;
    _emailStatus = widget.emailStatus;
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        Expanded(
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: Text(
              _title,
            ),
          ),
        ),
        Expanded(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              Switch(
                value: _emailStatus,
                onChanged: (value) {
                  setState(() => _emailStatus = value);
                  print(_emailStatus);
                },
              ),
              Switch(
                value: _pushStatus,
                onChanged: (value) {
                  setState(() => _pushStatus = value);
                  print(_pushStatus);
                },
              ),
            ],
          ),
        ),
      ],
    );
  }
}
class NotificationItem扩展StatefulWidget{
构造通知项({
关键点,
@需要这个标题,
@需要此状态,
@需要此电子邮件状态,
});
最后的字符串标题;
最终布尔状态;
最终bool状态;
@凌驾
_NotificationItemState createState()=>\u NotificationItemState();
}
类_NotificationItemState扩展状态{
字符串标题;
布尔(bool)状态;;
bool_电子邮件状态;
void initState(){
super.initState();
_title=widget.title;
_pushStatus=widget.pushStatus;
_emailStatus=widget.emailStatus;
}
@凌驾
小部件构建(构建上下文){
返回行(
儿童:[
扩大(
孩子:填充(
填充:常数边集全部(16.0),
子:文本(
_头衔,
),
),
),
扩大(
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
C
class NotificationItem extends StatefulWidget {
  const NotificationItem({
    Key key,
    @required this.title,
    @required this.pushStatus,
    @required this.emailStatus,
  });
  final String title;
  final bool pushStatus;
  final bool emailStatus;

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

class _NotificationItemState extends State<NotificationItem> {
  String _title;
  bool _pushStatus;
  bool _emailStatus;
  
  void initState() {
    super.initState();
    _title = widget.title;
    _pushStatus = widget.pushStatus;
    _emailStatus = widget.emailStatus;
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        Expanded(
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: Text(
              _title,
            ),
          ),
        ),
        Expanded(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              Switch(
                value: _emailStatus,
                onChanged: (value) {
                  setState(() => _emailStatus = value);
                  print(_emailStatus);
                },
              ),
              Switch(
                value: _pushStatus,
                onChanged: (value) {
                  setState(() => _pushStatus = value);
                  print(_pushStatus);
                },
              ),
            ],
          ),
        ),
      ],
    );
  }
}