【问题标题】:How can I individually Show/Hide multiple buttons using only one function?如何仅使用一项功能单独显示/隐藏多个按钮?
【发布时间】:2021-02-24 05:17:27
【问题描述】:

在这里,我在列小部件中排列了三个按钮,我希望它们在我单击 OnTapDown() 时单独隐藏,并在按下其中一个按钮时单独显示在 onTapUp() 上,但不幸的是,当我单击其中一个按钮时其中的显示和隐藏一次。我很困惑如何解决这个问题并获得理想的结果。 -- 这是我的代码,您可以查看。

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var text1 = '';
  double hide = 1;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Align(
      alignment: Alignment.center,
      child: Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ball(text: 'A'),
            ball(text: 'B'),
            ball(text: 'C'),
          ],
        ),
      ),
    ));
  }

  Widget ball({String text = ''}) {
    return GestureDetector(
      onTapDown: (TapDownDetails details) {
        setState(() {
          hide = 0;
        });
      },
      onTapUp: (TapUpDetails details) {
        setState(() {
          hide = 1;
        });
      },
      child: Opacity(
        opacity: hide,
        child: ClipOval(
          child: Container(
            color: Colors.black,
            width: 100,
            height: 100,
            child: Center(
              child: Text(
                text,
                style: TextStyle(
                  color: Colors.red,
                  fontSize: 40,
                  fontWeight: FontWeight.bold,
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart flutter-layout flutter-test


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    你可以通过Modelindex
    您可以在下面看到工作演示
    代码sn-p

    class Model {
      List<double> hide;
    
      Model({this.hide});
    }
    ...
    ball(text: 'A', index: 0, model: model),
    ball(text: 'B', index: 1, model: model),
    ball(text: 'C', index: 2, model: model),
    ...
    Widget ball({String text = '', int index, Model model}) {
        return GestureDetector(
          onTapDown: (TapDownDetails details) {
            setState(() {
              model.hide[index] = 0;
              print("onTapdwon ${model.hide.toString()}");
            });
          },
          onTapUp: (TapUpDetails details) {
            setState(() {
              model.hide[index] = 1;
              print("onTapUp ${model.hide.toString()}");
            });
          },
          child: Opacity(
            opacity: model.hide[index],
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    
    class Model {
      List<double> hide;
    
      Model({this.hide});
    }
    
    void main() {
      runApp(MaterialApp(
        home: MyApp(),
      ));
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      var text1 = '';
      Model model;
    
      @override
      void initState() {
        model = Model(hide: [1, 1, 1]);
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            body: Align(
          alignment: Alignment.center,
          child: Container(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ball(text: 'A', index: 0, model: model),
                ball(text: 'B', index: 1, model: model),
                ball(text: 'C', index: 2, model: model),
              ],
            ),
          ),
        ));
      }
    
      Widget ball({String text = '', int index, Model model}) {
        return GestureDetector(
          onTapDown: (TapDownDetails details) {
            setState(() {
              model.hide[index] = 0;
              print("onTapdwon ${model.hide.toString()}");
            });
          },
          onTapUp: (TapUpDetails details) {
            setState(() {
              model.hide[index] = 1;
              print("onTapUp ${model.hide.toString()}");
            });
          },
          child: Opacity(
            opacity: model.hide[index],
            child: ClipOval(
              child: Container(
                color: Colors.black,
                width: 100,
                height: 100,
                child: Center(
                  child: Text(
                    text,
                    style: TextStyle(
                      color: Colors.red,
                      fontSize: 40,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
              ),
            ),
          ),
        );
      }
    }
    

    【讨论】:

      【解决方案2】:

      您的问题来自这样一个事实,即 3 个球只有 1 个变量 hide。当你点击一个时,你更新了这个 hide 参数,它用于 3,所以所有的球都被隐藏了。

      Nilesh 提供了一个复制此参数的示例,它可以工作。

      您还可以将 Widget ball() 函数转换为有状态小部件,例如:

      import 'package:flutter/material.dart';
      
      void main() {
        runApp(MaterialApp(home: MyApp()));
      }
      
      class MyApp extends StatefulWidget {
        @override
        _MyAppState createState() => _MyAppState();
      }
      
      class _MyAppState extends State<MyApp> {
        @override
        Widget build(BuildContext context) {
          return Scaffold(
            body: Align(
              alignment: Alignment.center,
              child: Container(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Ball(text: 'A'),
                    Ball(text: 'B'),
                    Ball(text: 'C'),
                  ],
                ),
              ),
            ),
          );
        }
      }
      
      class Ball extends StatefulWidget {
        final String text;
      
        const Ball({Key key, this.text}) : super(key: key);
      
        @override
        _BallState createState() => _BallState();
      }
      
      class _BallState extends State<Ball> {
        double hide = 1;
      
        @override
        Widget build(BuildContext context) {
          return GestureDetector(
            onTapDown: (TapDownDetails details) {
              setState(() {
                hide = 0;
              });
            },
            onTapUp: (TapUpDetails details) {
              setState(() {
                hide = 1;
              });
            },
            child: Opacity(
              opacity: hide,
              child: ClipOval(
                child: Container(
                  color: Colors.black,
                  width: 100,
                  height: 100,
                  child: Center(
                    child: Text(
                      widget.text,
                      style: TextStyle(
                        color: Colors.red,
                        fontSize: 40,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                ),
              ),
            ),
          );
        }
      }
      

      在这个例子中,每个 Ball 都有自己的 hide 参数,所以它们不会干扰其他的。

      【讨论】:

        【解决方案3】:
        import 'package:flutter/material.dart';
        
        void main() {
          runApp(MaterialApp(
            home: MyApp(),
          ));
        }
        
        class MyApp extends StatefulWidget {
          @override
          _MyAppState createState() => _MyAppState();
        }
        
        class _MyAppState extends State<MyApp> {
          var text1 = '';
          double hide1 = 1;
          double hide2 = 1;
          double hide3 = 1;
        
          @override
          Widget build(BuildContext context) {
            return Scaffold(
                body: Align(
              alignment: Alignment.center,
              child: Container(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    ball(
                      0,
                      text: 'A',
                    ),
                    ball(
                      1,
                      text: 'B',
                    ),
                    ball(
                      2,
                      text: 'C',
                    ),
                  ],
                ),
              ),
            ));
          }
        
          Widget ball(double hide, {String text = ''}) {
            return GestureDetector(
              onTapDown: (TapDownDetails details) {
                setState(() {
                  if (hide == 0) {
                    hide1 = hide1 == 1 ? 0 : 1;
                  } else if (hide == 1) {
                    hide2 = hide2 == 1 ? 0 : 1;
                  } else {
                    hide3 = hide3 == 1 ? 0 : 1;
                  }
                });
              },
              onTapUp: (TapUpDetails details) {},
              child: Opacity(
                opacity: hide == 0 ? hide1 : hide == 1 ? hide2 : hide3,
                child: ClipOval(
                  child: Container(
                    color: Colors.black,
                    width: 100,
                    height: 100,
                    child: Center(
                      child: Text(
                        text,
                        style: TextStyle(
                          color: Colors.red,
                          fontSize: 40,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    ),
                  ),
                ),
              ),
            );
          }
        }
        

        【讨论】:

        • 没有得到想要的结果它和以前一样
        猜你喜欢
        • 2021-11-27
        • 1970-01-01
        • 2013-01-13
        • 2020-12-23
        • 2016-03-02
        • 1970-01-01
        • 2023-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多