如何添加有状态的窗口小部件或在底部的另一个屏幕中查看

马哈茂德·哈鲁尼

我创建了一个动画单选圆形按钮,如下图所示:

例

这是下面的代码:

import 'package:flutter/material.dart';
import 'package:catest/utils/animated_radio_btn.dart';

class RadioBtnSim extends StatefulWidget {

  RadioBtnSim({Key key, this.title}) : super(key: key);

  final String title;
  String radioValue = 'First';
  // final bool showFavs;

  // PropertiesGrid(this.showFavs);

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

class _RadioBtnSimState extends State<RadioBtnSim> with SingleTickerProviderStateMixin {
  _RadioBtnSimState() {
    customBuilder = (BuildContext context, List<dynamic> animValues, Function updateState, String value) {
      return GestureDetector(
        onTap: () {
          setState(() {
            widget.radioValue = value;
          });
        },
        child: Container(
          width: double.infinity,
          height: animValues[0] * 40 + 60,
          color: animValues[1],
          child: Center(
            child: Text(
              value
            )
          ),
        ),
      );
    };
    simpleBuilder = (BuildContext context, List<double> animValues, Function updateState, String value) {
      final alpha = (animValues[0] * 255).toInt();
      return GestureDetector(
        onTap:  () {
          setState(() {
            widget.radioValue = value;
          });
        },
        child: Container(
          padding: EdgeInsets.all(32.0),
          margin: EdgeInsets.symmetric(horizontal: 2.0, vertical: 12.0),
          alignment: Alignment.center,
          decoration: BoxDecoration(
            shape: BoxShape.circle,
            color: Theme.of(context).primaryColor.withAlpha(alpha),
            border: Border.all(
              color: Theme.of(context).primaryColor.withAlpha(255 - alpha),
              width: 4.0,
            )
          ),
          child: Text(
            value,
            style: Theme.of(context).textTheme.body1.copyWith(fontSize: 20.0),
          )
        )
      );
    };
    dynamicBuilder = (BuildContext context, List<dynamic> animValues, Function updateState, String value) {
      return GestureDetector(
        onTap: () {
          setState(() {
            widget.radioValue = value;
          });
        },
        child: Container(
          alignment: Alignment.center,
          margin: EdgeInsets.symmetric(horizontal: 4.0, vertical: 12.0),
          padding: EdgeInsets.all(32.0 + animValues[0] * 12.0),
          decoration: BoxDecoration(
            shape: BoxShape.circle,
            color: animValues[1],
            border: Border.all(
              color: animValues[2],
              width: 2.0
            )
          ),
          child: Text(
            value,
            style: Theme.of(context).textTheme.body1.copyWith(
              fontSize: 20.0,
              color: animValues[2]
            ),
          )
        )
      );
    };
  }

  RadioBuilder<String, dynamic> customBuilder;

  RadioBuilder<String, double> simpleBuilder;

  RadioBuilder<String, dynamic> dynamicBuilder;

  AnimationController _controller;

  Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    var animationController = AnimationController(
      duration: Duration(milliseconds: 100),
      vsync: this
    );
    _controller = animationController;
    _animation = CurvedAnimation(
      parent: _controller,
      curve: Curves.ease
    );
    _controller.addListener(() {
      setState(() {});
    });
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return ListView(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              CustomRadio<String, dynamic>(
                value: 'Sim 1',
                groupValue: widget.radioValue,
                animsBuilder: (AnimationController controller) => [
                  CurvedAnimation(
                    parent: controller,
                    curve: Curves.easeInOut
                  ),
                  ColorTween(
                    begin: Colors.white,
                    end: Colors.deepPurple
                  ).animate(controller),
                  ColorTween(
                    begin: Colors.deepPurple,
                    end: Colors.white
                  ).animate(controller),
                ],
                builder: dynamicBuilder,
              ),
              CustomRadio<String, dynamic>(
                value: 'Sim 2',
                groupValue: widget.radioValue,
                animsBuilder: (AnimationController controller) => [
                  CurvedAnimation(
                    parent: controller,
                    curve: Curves.easeInOut
                  ),
                  ColorTween(
                    begin: Colors.white,
                    end: Colors.deepPurple
                  ).animate(controller),
                  ColorTween(
                    begin: Colors.deepPurple,
                    end: Colors.white
                  ).animate(controller),
                ],
                builder: dynamicBuilder,
              ),
            ]
          ),
        ],
      );
  }
}

现在我有另一个屏幕如下:

屏幕

这是下面的相关代码:

import 'package:flutter/material.dart';
import 'package:catest/config/app_theme.dart';
import '../widgets/radio_btn_sim.dart';

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        children: [
          Padding(
            padding: const EdgeInsets.only(
              top: 100,
              left: 20,
            ),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text(
                  'Sim information',
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
                Padding(
                  padding: const EdgeInsets.only(
                    left: 30,
                  ),
                  child: DataTable(
                    columns: [
                      DataColumn(label: Text('Sim operator')),
                      DataColumn(
                          label: Row(
                        children: <Widget>[
                          Text('Vodafone'),
                          Image.asset(
                            'assets/images/vodic.png',
                            width: 30,
                            height: 30,
                          )
                        ],
                      )),
                    ],
                    rows: [
                      DataRow(cells: [
                        DataCell(Row(
                          children: <Widget>[
                            Image.asset(
                              'assets/images/sim_ic.png',
                              width: 30,
                              height: 30,
                            ),
                            Text('ICCID'),
                          ],
                        )),
                        DataCell(Text('123456789')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('IMEI')),
                        DataCell(Text('123456789')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('SIM IMSI')),
                        DataCell(Text('123456789')),
                      ]),
                    ],
                  ),
                ),
              ],
            ),
          ),
          //Network provider
          Padding(
            padding: const EdgeInsets.only(
              top: 20,
              left: 20,
            ),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text(
                  'Network Provider',
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
                Padding(
                  padding: const EdgeInsets.only(
                    left: 30,
                  ),
                  child: DataTable(
                    columns: [
                      DataColumn(label: Text('Operator')),
                      DataColumn(
                          label: Row(
                        children: <Widget>[
                          Text('Vodafone NL'),
                          Image.asset(
                            'assets/images/vodic.png',
                            width: 30,
                            height: 30,
                          )
                        ],
                      )),
                    ],
                    rows: [
                      DataRow(cells: [
                        DataCell(Row(
                          children: <Widget>[
                            Text('MCC'),
                          ],
                        )),
                        DataCell(Text('204')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('MNC')),
                        DataCell(Text('04')),
                      ]),
                    ],
                  ),
                ),
              ],
            ),
          ),
          //Serving Cell
          Padding(
            padding: const EdgeInsets.only(
              top: 20,
              left: 20,
            ),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text(
                  'Serving Cell',
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
                Padding(
                  padding: const EdgeInsets.only(
                    left: 30,
                  ),
                  child: DataTable(
                    columns: [
                      DataColumn(label: Text('Data Net')),
                      DataColumn(
                          label: Row(
                        children: <Widget>[
                          Text('LTE'),
                        ],
                      )),
                    ],
                    rows: [
                      DataRow(cells: [
                        DataCell(Row(
                          children: <Widget>[
                            Text('Data type'),
                          ],
                        )),
                        DataCell(Text('LTE')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('TAC')),
                        DataCell(Text('62603')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('PCI')),
                        DataCell(Text('118')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('ECI')),
                        DataCell(Text('12315644(5465-567)')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('EARFCN')),
                        DataCell(Text('1300/19300')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('EARFCN')),
                        DataCell(Text('1300/19300')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('FREQ')),
                        DataCell(Text('1815/1720')),
                      ]),
                      DataRow(cells: [
                        DataCell(Text('BAND')),
                        DataCell(Text('3 FDD')),
                      ]),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

因此,现在我想将我创建的单选按钮放在底部,HomeScreen如下图所示:

screen_home

这是utilsor animation part

library custom_radio;

import 'package:flutter/material.dart';

typedef AnimationsBuilder<T> = List<Animation<T>> Function(AnimationController);

typedef RadioBuilder<T, U> = Widget Function(BuildContext context, List<U> animValues, Function updateState, T value);
class CustomRadio<T, U> extends StatefulWidget {

  final RadioBuilder<T, U> builder;

  /// The duration of the animation controller
  final Duration duration;

  /// Returns the list of child animations whose values will be passed to the builder.
  /// Called on initState.
  final AnimationsBuilder<U> animsBuilder;
  
  final T value;
  
  final T groupValue;

  bool get checked => value == groupValue;

  CustomRadio({
    Key key,
    this.animsBuilder,
    this.duration = const Duration(milliseconds: 600),
    @required this.builder,
    @required this.value,
    @required this.groupValue,
  })  : assert(duration != null),
        super(key: key);

  @override
  State<CustomRadio> createState() => _CustomRadioState<T, U>();
}

class _CustomRadioState<T, U> extends State<CustomRadio<T, U>>
    with SingleTickerProviderStateMixin {
  AnimationController _controller;
  List<Animation> _animations;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(duration: widget.duration, vsync: this);
    _animations = widget.animsBuilder(_controller);
    _animations.forEach((anim) => anim.addListener(() => setState(() {})));
    if (widget.checked)
      _controller.value = 1.0;
    else
      _controller.value = 0.0;
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  void _updateState() {
    setState(() {
      if (widget.checked && _controller.status != AnimationStatus.completed) {
        _controller.forward();
      } else {
        _controller.reverse();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    if ((widget.checked &&
            (_controller.status == AnimationStatus.dismissed ||
                _controller.status == AnimationStatus.reverse)) ||
        (!widget.checked &&
            (_controller.status == AnimationStatus.completed ||
                _controller.status == AnimationStatus.forward))) {
      _updateState();
    }

    final anims = _animations.map<U>((anim) => anim.value).toList();
    return widget.builder(
      context,
      anims.length > 0 ? anims : [widget.checked].cast<dynamic>(),
      _updateState,
      widget.value,
    );
  }
}

我希望这会很清楚,如果有任何遗漏的信息,对不起:..

Timilehin Jegede

在主屏幕中使用StackPositioned小部件:

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          SingleChildScrollView(
            child: Column(
              children: [
                Padding(
                  padding: const EdgeInsets.only(
                    top: 100,
                    left: 20,
                  ),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        'Sim information',
                        style: TextStyle(fontWeight: FontWeight.bold),
                      ),
                      Padding(
                        padding: const EdgeInsets.only(
                          left: 30,
                        ),
                        child: DataTable(
                          columns: [
                            DataColumn(label: Text('Sim operator')),
                            DataColumn(
                                label: Row(
                              children: <Widget>[
                                Text('Vodafone'),
                                Image.asset(
                                  'assets/images/vodic.png',
                                  width: 30,
                                  height: 30,
                                )
                              ],
                            )),
                          ],
                          rows: [
                            DataRow(cells: [
                              DataCell(Row(
                                children: <Widget>[
                                  Image.asset(
                                    'assets/images/sim_ic.png',
                                    width: 30,
                                    height: 30,
                                  ),
                                  Text('ICCID'),
                                ],
                              )),
                              DataCell(Text('123456789')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('IMEI')),
                              DataCell(Text('123456789')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('SIM IMSI')),
                              DataCell(Text('123456789')),
                            ]),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
                //Network provider
                Padding(
                  padding: const EdgeInsets.only(
                    top: 20,
                    left: 20,
                  ),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        'Network Provider',
                        style: TextStyle(fontWeight: FontWeight.bold),
                      ),
                      Padding(
                        padding: const EdgeInsets.only(
                          left: 30,
                        ),
                        child: DataTable(
                          columns: [
                            DataColumn(label: Text('Operator')),
                            DataColumn(
                                label: Row(
                              children: <Widget>[
                                Text('Vodafone NL'),
                                Image.asset(
                                  'assets/images/vodic.png',
                                  width: 30,
                                  height: 30,
                                )
                              ],
                            )),
                          ],
                          rows: [
                            DataRow(cells: [
                              DataCell(Row(
                                children: <Widget>[
                                  Text('MCC'),
                                ],
                              )),
                              DataCell(Text('204')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('MNC')),
                              DataCell(Text('04')),
                            ]),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
                //Serving Cell
                Padding(
                  padding: const EdgeInsets.only(
                    top: 20,
                    left: 20,
                  ),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        'Serving Cell',
                        style: TextStyle(fontWeight: FontWeight.bold),
                      ),
                      Padding(
                        padding: const EdgeInsets.only(
                          left: 30,
                        ),
                        child: DataTable(
                          columns: [
                            DataColumn(label: Text('Data Net')),
                            DataColumn(
                                label: Row(
                              children: <Widget>[
                                Text('LTE'),
                              ],
                            )),
                          ],
                          rows: [
                            DataRow(cells: [
                              DataCell(Row(
                                children: <Widget>[
                                  Text('Data type'),
                                ],
                              )),
                              DataCell(Text('LTE')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('TAC')),
                              DataCell(Text('62603')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('PCI')),
                              DataCell(Text('118')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('ECI')),
                              DataCell(Text('12315644(5465-567)')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('EARFCN')),
                              DataCell(Text('1300/19300')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('EARFCN')),
                              DataCell(Text('1300/19300')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('FREQ')),
                              DataCell(Text('1815/1720')),
                            ]),
                            DataRow(cells: [
                              DataCell(Text('BAND')),
                              DataCell(Text('3 FDD')),
                            ]),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
          Positioned(
            bottom: 0,
            child: SizedBox(
              width: MediaQuery.of(context).size.width,
              child: RadioBtnSim(
              ),
            ),
          ),
        ],
      ),
    );
  }
}

删除中的Scaffold礼物RadioBtnSim

return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        CustomRadio<String, dynamic>(
          value: 'Sim 1',
          groupValue: widget.radioValue,
          animsBuilder: (AnimationController controller) => [
            CurvedAnimation(parent: controller, curve: Curves.easeInOut),
            ColorTween(begin: Colors.white, end: Colors.deepPurple)
                .animate(controller),
            ColorTween(begin: Colors.deepPurple, end: Colors.white)
                .animate(controller),
          ],
          builder: dynamicBuilder,
        ),
        CustomRadio<String, dynamic>(
          value: 'Sim 2',
          groupValue: widget.radioValue,
          animsBuilder: (AnimationController controller) => [
            CurvedAnimation(parent: controller, curve: Curves.easeInOut),
            ColorTween(begin: Colors.white, end: Colors.deepPurple)
                .animate(controller),
            ColorTween(begin: Colors.deepPurple, end: Colors.white)
                .animate(controller),
          ],
          builder: dynamicBuilder,
        ),
      ],
    );

输出:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从另一个类触发有状态窗口小部件中的函数(onUnityAdsFinish时)?

来自分类Dev

如何基于同一布局中的另一个窗口小部件将添加的窗口小部件放置到布局中?

来自分类Dev

如何正确地从另一个有状态小部件调用的有状态小部件返回数据?

来自分类Dev

在另一个窗口小部件包含的窗口小部件中绘图

来自分类Dev

如何在颤抖中将一个有状态的小部件的状态从另一个状态更改为?

来自分类Dev

如何从Flutter中的另一个小部件访问状态小部件动画控制器?

来自分类Dev

如何使用全局密钥从Flutter中的另一个小部件更新小部件状态?

来自分类Dev

QT C ++-如何在另一个类中引用窗口小部件

来自分类Dev

如何在Flutter中将一个小部件(statefull)的状态从另一个statefull小部件更改?

来自分类Dev

无法从Qt中的另一个窗口小部件访问窗口小部件中的控件

来自分类Dev

如何在Flutter中将事件从一个有状态的小部件广播到另一个小部件

来自分类Dev

Flutter-触发另一个窗口小部件方法,该窗口小部件位于另一个文件中

来自分类Dev

如何从另一个对话框类访问窗口小部件类

来自分类Dev

如何从另一个对话框类访问窗口小部件类

来自分类Dev

如何从父窗口小部件更改一个子窗口小部件的状态,而子窗口小部件是单独文件中的单独类?

来自分类Dev

Qt:如何在状态栏中添加两个小部件(例如QPushButton),一个添加到左侧,另一个添加到右侧?

来自分类Dev

如何用另一个替换Qsplitter中的一个小部件?

来自分类Dev

ipywidgets:根据另一个窗口小部件的结果更新一个窗口小部件

来自分类Dev

当一个窗口小部件进入另一个窗口小部件的某个距离/区域内时,如何触发信号?

来自分类Dev

在Tkinter中滚动一个小部件与另一个小部件

来自分类Dev

使用Android窗口小部件将意图从主屏幕传递到另一个Java文件

来自分类Dev

如何添加浮动操作按钮,该按钮可在flutter中粘贴到另一个小部件

来自分类Dev

在Qt中将小部件居中放置在另一个小部件中

来自分类Dev

另一个小部件Qt中的小部件

来自分类Dev

Flutter在堆栈中另一个小部件下混合/掩盖多个小部件

来自分类Dev

另一个小部件Qt中的小部件

来自分类Dev

如何从Flutter中的另一个文件调用小部件部分

来自分类Dev

Python Qt - 如何从另一个线程在表小部件中插入项目?

来自分类Dev

如何从 kivy 中的另一个页面删除小部件

Related 相关文章

  1. 1

    如何从另一个类触发有状态窗口小部件中的函数(onUnityAdsFinish时)?

  2. 2

    如何基于同一布局中的另一个窗口小部件将添加的窗口小部件放置到布局中?

  3. 3

    如何正确地从另一个有状态小部件调用的有状态小部件返回数据?

  4. 4

    在另一个窗口小部件包含的窗口小部件中绘图

  5. 5

    如何在颤抖中将一个有状态的小部件的状态从另一个状态更改为?

  6. 6

    如何从Flutter中的另一个小部件访问状态小部件动画控制器?

  7. 7

    如何使用全局密钥从Flutter中的另一个小部件更新小部件状态?

  8. 8

    QT C ++-如何在另一个类中引用窗口小部件

  9. 9

    如何在Flutter中将一个小部件(statefull)的状态从另一个statefull小部件更改?

  10. 10

    无法从Qt中的另一个窗口小部件访问窗口小部件中的控件

  11. 11

    如何在Flutter中将事件从一个有状态的小部件广播到另一个小部件

  12. 12

    Flutter-触发另一个窗口小部件方法,该窗口小部件位于另一个文件中

  13. 13

    如何从另一个对话框类访问窗口小部件类

  14. 14

    如何从另一个对话框类访问窗口小部件类

  15. 15

    如何从父窗口小部件更改一个子窗口小部件的状态,而子窗口小部件是单独文件中的单独类?

  16. 16

    Qt:如何在状态栏中添加两个小部件(例如QPushButton),一个添加到左侧,另一个添加到右侧?

  17. 17

    如何用另一个替换Qsplitter中的一个小部件?

  18. 18

    ipywidgets:根据另一个窗口小部件的结果更新一个窗口小部件

  19. 19

    当一个窗口小部件进入另一个窗口小部件的某个距离/区域内时,如何触发信号?

  20. 20

    在Tkinter中滚动一个小部件与另一个小部件

  21. 21

    使用Android窗口小部件将意图从主屏幕传递到另一个Java文件

  22. 22

    如何添加浮动操作按钮,该按钮可在flutter中粘贴到另一个小部件

  23. 23

    在Qt中将小部件居中放置在另一个小部件中

  24. 24

    另一个小部件Qt中的小部件

  25. 25

    Flutter在堆栈中另一个小部件下混合/掩盖多个小部件

  26. 26

    另一个小部件Qt中的小部件

  27. 27

    如何从Flutter中的另一个文件调用小部件部分

  28. 28

    Python Qt - 如何从另一个线程在表小部件中插入项目?

  29. 29

    如何从 kivy 中的另一个页面删除小部件

热门标签

归档