【问题标题】:Update existing StatefulWidget class's widget in flutter在颤振中更新现有的 StatefulWidget 类的小部件
【发布时间】:2019-08-29 17:18:06
【问题描述】:

当用户按下 onTapDown() 和 onTapUP(在 GestureDetector 内)时,我想更新我的 MaterialButton。但我无法做到这一点。我试过但没有成功。我已经在控制台中打印了一些信息来检查我的代码是否正常工作,但在不更新我的 MaterialButton 小部件的情况下一切正常。请帮我 我的一些代码如下:-

(此代码用于具有可变背景图像的按钮)。

Container(
color: Colors.amber,
alignment: Alignment.center,
padding: EdgeInsets.only(top: 15, bottom: 10),
child: Text(
   "CALL FUNTIONS",
    style: TextStyle(
       fontSize: 25,
       fontWeight: FontWeight.bold,
  ),
)),
Container(
padding: EdgeInsets.only(bottom: 10),
color: Colors.amber,
child: callFunctionsForLessThan600Pixel(),
),


Widget callFunctionsForLessThan600Pixel() {
return new Column(
  mainAxisAlignment: MainAxisAlignment.center,
  crossAxisAlignment: CrossAxisAlignment.center,
  children: <Widget>[
    Row(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: <Widget>[
       lessThan600Pixel(Key("LockCallButton"),"button_default","locked"),
   lessThan600Pixel(Key("UnLockCallButton"),"button_default","unlocked"),
       lessThan600Pixel(Key("StatusCallButton"),"button_default","info"),
      ],
    ),
  ],
);
}

Widget lessThan600Pixel(Key key, String buttonName, String svgName) {
return MaterialButton(
  key: key,
  child: ConstrainedBox(
    constraints: BoxConstraints(
      maxHeight: 70,
      maxWidth: 70,
    ),
    child: GestureDetector(
      child: Stack(
        children: <Widget>[
          Image.asset("assets/images/$buttonName.png",),
          SvgPicture.asset(
            "assets/images/$svgName.svg",
            height: 30,
            width: 30,
            color: Colors.white,
          ),
        ],
        alignment: Alignment.center,
      ),
      onTapDown: (v) {
        buttonTappedDown(key, svgName);
      },
      onTapUp: (v) {
        buttonTappedDown(key, svgName);
      },
    ),
  ),
  onPressed: buttonPressed,
  elevation: 0,
  highlightElevation: 0,
  highlightColor: Colors.amber,
);
}



void buttonTappedDown(Key key, String svgName) {
setState(() {
  lessThan600Pixel(key, "button_pressed", svgName);
});
}

void buttonTappedUp(Key key, String svgName) {
setState(() {
  lessThan600Pixel(key, "button_default", svgName);
});
}

【问题讨论】:

    标签: flutter flutter-layout


    【解决方案1】:

    要拥有交互式 UI,您需要将小部件类设为 Stateful,并且在 onPressed 函数上,您只需使用 setState() 方法来执行任何更改。 通过这种方式,小部件知道必须刷新。

    如果您的小部件是无状态的,它将永远不会更新。

    这里是 Goolge 的入门教程,教你很好的 Statefull 逻辑:https://flutter.dev/docs/development/ui/interactive

    【讨论】:

    • 这意味着我将使用我的 MaterialButton 作为 Statefull 小部件?
    • 我的小部件是有状态的,但还没有工作。我的代码有任何其他方式或问题吗?
    • 你能用你的 Statful 小部件类更新你的问题吗?
    • 用谷歌教程更新了答案,让你的 ui 互动
    • 我已经根据教程更新了我的代码,使用一些条件现在可以正常工作,但是一个问题正在运行,我按下一个按钮,然后在每个按钮上播放动画,这是意外的。你能给我一个简短的例子吗?
    【解决方案2】:
    My all code are below:-
    
    
    import 'package:flutter/material.dart';
    import 'package:flutter_svg/flutter_svg.dart';
    
    class FirstPage extends StatefulWidget {
    @override
    _FirstPageState createState() => _FirstPageState();
    }
    
    class _FirstPageState extends State<FirstPage> {
    var screenWidth;
    var isMobile;
    var scaffoldKey = GlobalKey<ScaffoldState>();
    bool isTap = false;
    
    
    @override
    Widget build(BuildContext context) {
    isMobile = MediaQuery
        .of(context)
        .size
        .width < 600;
    screenWidth = MediaQuery
        .of(context)
        .size
        .width;
    
    return Scaffold(
      key: scaffoldKey,
      backgroundColor: Colors.amber[300],
      appBar: AppBar(
        title: Text("Home Page"),
      ),
      body: SingleChildScrollView(
        child: Container(
          child: Column(
            children: <Widget>[
              Container(
                  color: Colors.amber,
                  alignment: Alignment.center,
                  padding: EdgeInsets.only(top: 15, bottom: 10),
                  child: Text(
                    "CALL FUNTIONS",
                    style: TextStyle(
                      fontSize: 25,
                      fontWeight: FontWeight.bold,
                    ),
                  )),
              Container(
                padding: EdgeInsets.only(bottom: 10),
                color: Colors.amber,
                child: callFunctionsForLessThan600Pixel(),
              ),
              Container(
                  color: Colors.amber,
                  alignment: Alignment.center,
                  margin: EdgeInsets.only(top: 8),
                  padding: EdgeInsets.only(top: 15, bottom: 10),
                  child: Text(
                    "SMS FUNTIONS",
                    style: TextStyle(
                      fontSize: 25,
                      fontWeight: FontWeight.bold,
                    ),
                  )),
            ],
          ),
        ),
      ),
      );
      }
    
    
     Widget callFunctionsForLessThan600Pixel() {
     return new Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: <Widget>[
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            lessThan600Pixel(Key("LockCallButton"), "button_default", "locked"),
            lessThan600Pixel(
                Key("UnLockCallButton"), "button_default", "unlocked"),
            lessThan600Pixel(Key("StatusCallButton"), "button_default", "info"),
          ],
        ),
      ],
     );
     }
    
     void buttonTappedDown(Key key, String svgName) {
     setState(() {
      lessThan600Pixel(key, "button_pressed", svgName);
     });
     }
    
    void buttonTappedUp(Key key, String svgName) {
    setState(() {
      lessThan600Pixel(key, "button_default", svgName);
    });
    }
    
     Widget lessThan600Pixel(Key key, String buttonName, String svgName) {
    return MaterialButton(
      key: key,
      child: ConstrainedBox(
        constraints: BoxConstraints(
          maxHeight: 70,
          maxWidth: 70,
        ),
        child: GestureDetector(
          child: Stack(
            children: <Widget>[
              Image.asset("assets/images/$buttonName.png",),
              SvgPicture.asset(
                "assets/images/$svgName.svg",
                height: 30,
                width: 30,
                color: Colors.white,
              ),
            ],
            alignment: Alignment.center,
          ),
          onTapDown: (v) {
            buttonTappedDown(key, svgName);
          },
          onTapUp: (v) {
            buttonTappedDown(key, svgName);
          },
        ),
      ),
      elevation: 0,
      highlightElevation: 0,
      highlightColor: Colors.amber,
    );
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 2022-11-12
      • 2019-07-22
      • 2021-10-02
      • 1970-01-01
      • 2021-04-05
      • 2017-10-18
      • 2020-11-08
      • 2018-11-12
      相关资源
      最近更新 更多