【问题标题】:Add blinking to button为按钮添加闪烁
【发布时间】:2017-05-11 20:10:14
【问题描述】:

我想在选择单选按钮时将用户的注意力吸引到提交按钮上,并且我想知道是否有任何方法可以在颤振中实现这一点。我查看了 RaisedButton 文档,但似乎没有任何属性可以闪烁或摇动按钮。例如,下面的代码最初没有选择单选按钮,因此按钮显示为灰色,一旦在多个单选按钮中做出选择,提交 RaisedButton onPressed 属性值不再为空,而是替换为所需的操作;但是我还想要一种情况,如果选择了不同的单选按钮,则可以通过某种方式向提交按钮添加一些动作(闪烁/摇晃按钮)但不更改 onPressed 属性

new Radio<int>(
value: 1, 
groupValue: 0, 
onChanged: handleRadioValue
)

new RaisedButton(
child: const Text('SUBMIT')
onPressed: selected
)

handleRadioValue(){
selected = groupValue == 0 ? null : submitButton();
//change Raised button to attract attention}

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    您可以通过为RaisedButtoncolor 设置动画来吸引注意力。当单选按钮选择通过将其颜色更改为当前主题的disabledColor 并返回时,此示例引起对RaisedButton 的注意。

    import 'dart:math';
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(new MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
            title: 'Flutter Demo',
            home: new MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key}) : super(key: key);
      @override
      createState() => new MyHomePageState();
    }
    
    class MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
      AnimationController _controller;
      int _radioValue;
    
      @override initState() {
        _controller = new AnimationController(
          vsync: this,
          duration: const Duration(milliseconds: 100),
        )..addStatusListener((AnimationStatus status) {
          if (status == AnimationStatus.completed)
            _controller.reverse();
        });
        super.initState();
      }
    
      void _handleRadioValue(int value) {
        // Don't animate the first time that the radio value is set
        if (_radioValue != null)
          _controller.forward();
        setState(() {
          _radioValue = value;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        ThemeData theme = Theme.of(context);
        return new Scaffold(
          body: new Center(
            child: new Column(
              mainAxisSize: MainAxisSize.max,
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                new Radio<int>(
                  value: 0,
                  groupValue: _radioValue,
                  onChanged: _handleRadioValue
                ),
                new Radio<int>(
                  value: 1,
                  groupValue: _radioValue,
                  onChanged: _handleRadioValue
                ),
                new AnimatedBuilder(
                  child: const Text('SUBMIT'),
                  animation: _controller,
                  builder: (BuildContext context, Widget child) {
                    return new RaisedButton(
                      color: new ColorTween(
                        begin: theme.primaryColor,
                        end: theme.disabledColor,
                      ).animate(_controller).value,
                      colorBrightness: Brightness.dark,
                      child: child,
                      onPressed: _radioValue == null ?
                                 null :
                                 () => print('submit')
                    );
                  }
                )
              ],
            ),
          ),
        );
      }
    
      @override
      void dispose() {
        _controller.dispose();
        super.dispose();
      }
    }
    

    【讨论】:

    • 这正如我所愿。谢谢!跟进,如果 Radio 有一个子文本我想在按下提交时替换(使用 onPressed 中的函数),我将把函数放在哪里?将函数置于 setState 会在调用 _handleRadioValue 但未激活提交按钮时更改文本。
    • 如果不查看您的代码,我不确定我是否理解您的问题。你能用你的代码示例创建一个新问题,我会回答吗?
    • 好的,发布了一个新问题here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2013-08-03
    • 2018-11-16
    相关资源
    最近更新 更多