代码之家  ›  专栏  ›  技术社区  ›  Daniele

选择其他按钮时取消选择按钮

  •  1
  • Daniele  · 技术社区  · 6 年前

    我创建了一个自定义按钮,根据 bool pressAttention 参数。

    class UserButton extends StatefulWidget {
      final String unselectedImagePath;
      final String selectedImagePath;
      final String text;
    
      UserButton({
        this.unselectedImagePath, 
        this.selectedImagePath, 
        this.text,
        });
    
      @override
      State<StatefulWidget> createState() => _UserButtonState();
    }
    
    class _UserButtonState extends State<UserButton> {
      bool pressAttention = false;
    
      @override
      Widget build(BuildContext context) {
        return Column(
          children: <Widget>[
            Ink.image(
              image: pressAttention
                  ? AssetImage(widget.selectedImagePath)
                  : AssetImage(widget.unselectedImagePath),
              fit: BoxFit.cover,
              width: 150.0,
              height: 150.0,
              child: InkWell(
                splashColor: Colors.transparent,
                highlightColor: Colors.transparent,
                onTap: () {
                  setState(() {
                    pressAttention = !pressAttention;
                  });
                },
              ),
            ),
            Padding(
              padding: EdgeInsets.only(top: 30.0),
              child: Text(
                widget.text,
                style: TextStyle(
                  color: pressAttention
                      ? Theme.of(context).accentColor
                      : Colors.white,
                  fontFamily: "Roboto",
                  fontSize: 18.0
                ),
              ),
            )
          ],
        );
      }
    }
    

    然后在我的主班里这样给他们充气:

    Padding(
                padding: EdgeInsets.only(top: 100.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    UserButton(
                      selectedImagePath: 'assets/whistle_orange.png',
                      unselectedImagePath: 'assets/whistle.png',
                      text: "Coach",
                    ),
                    Container(width: 30.0,),
                    UserButton(
                      selectedImagePath: 'assets/weight_orange.png',
                      unselectedImagePath: 'assets/weight.png',
                      text: "Student",
                    )
                  ],
                ),
              ),
    

    当两个按钮本身正常工作时,我需要禁用第一个按钮(更改 pressAttention 并打电话 setState() )还有维切弗萨。

    我怎样才能做到?

    1 回复  |  直到 6 年前
        1
  •  1
  •   diegoveloper    6 年前

    您可以从父窗口小部件处理状态并将其传递给您的子窗口小部件,这是一个如何实现这一点的示例,当然,您可以改进代码并创建自己的“父”按钮控制器:

        class UserButton extends StatefulWidget {
          final String unselectedImagePath;
          final String selectedImagePath;
          final String text;
          final VoidCallback onTap;
          final bool selected;
    
          UserButton({
            this.unselectedImagePath,
            this.selectedImagePath,
            this.text,
            this.selected,
            this.onTap,
          });
    
          @override
          State<StatefulWidget> createState() => _UserButtonState();
        }
    
        class _UserButtonState extends State<UserButton> {
          bool pressAttention = false;
    
          @override
          Widget build(BuildContext context) {
            pressAttention = widget.selected;
            return Column(
              children: <Widget>[
                Ink.image(
                  image: pressAttention
                      ? AssetImage(widget.selectedImagePath)
                      : AssetImage(widget.unselectedImagePath),
                  fit: BoxFit.cover,
                  width: 150.0,
                  height: 150.0,
                  child: InkWell(
                    splashColor: Colors.transparent,
                    highlightColor: Colors.transparent,
                    onTap: () {
                      setState(() {
                        pressAttention = !pressAttention;
                      });
                      if (widget.onTap != null) widget.onTap();
                    },
                  ),
                ),
                Padding(
                  padding: EdgeInsets.only(top: 30.0),
                  child: Text(
                    widget.text,
                    style: TextStyle(
                        color: pressAttention
                            ? Theme.of(context).accentColor
                            : Colors.white,
                        fontFamily: "Roboto",
                        fontSize: 18.0),
                  ),
                )
              ],
            );
          }
        }
    
        class ParentMain extends StatefulWidget {
          @override
          _ParentMainState createState() => _ParentMainState();
        }
    
        class _ParentMainState extends State<ParentMain> {
          bool selectedButtonCoach = false;
          bool selectedButtonStudent = false;
    
          @override
          Widget build(BuildContext context) {
            return Container(
              child: Padding(
                padding: EdgeInsets.only(top: 100.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    UserButton(
                      selectedImagePath: 'assets/whistle_orange.png',
                      unselectedImagePath: 'assets/whistle.png',
                      text: "Coach",
                      selected: selectedButtonCoach,
                      onTap: () {
                        setState(() {
                          selectedButtonCoach = true;
                          selectedButtonStudent = false;
                        });
                      },
                    ),
                    Container(
                      width: 30.0,
                    ),
                    UserButton(
                      selectedImagePath: 'assets/weight_orange.png',
                      unselectedImagePath: 'assets/weight.png',
                      text: "Student",
                      selected: selectedButtonStudent,
                      onTap: () {
                        setState(() {
                          selectedButtonCoach = false;
                          selectedButtonStudent = true;
                        });
                      },
                    )
                  ],
                ),
              ),
            );
          }
        }
    

    看看收音机小部件是如何工作的: https://github.com/flutter/flutter/blob/master/examples/flutter_gallery/lib/demo/material/selection_controls_demo.dart

    https://docs.flutter.io/flutter/material/Radio-class.html