mobile - Flutter - 通知 Column 内的兄弟小部件

标签 mobile flutter observer-pattern flutter-layout

我正在尝试创建一个功能,当我点击 Expanded 小部件内的 FlatButton 时,它的 flex 变为 < strong>2 和其他兄弟 FlatButton 的 flex 更改为 1

enter image description here

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Directionality(
      textDirection: TextDirection.ltr,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          new ButtonWidget(text: "Hello",selectedColor: Colors.yellow),
          new ButtonWidget(text: "This is", selectedColor: Colors.red),
          new ButtonWidget(text: "Button", selectedColor: Colors.blue),
        ],
      ),
    );
  }
}

class ButtonWidget extends StatefulWidget {
  String text;
  MaterialColor selectedColor;

  ButtonWidget({this.text, this.selectedColor});

  createState() =>
      ButtonState(text: this.text, selectedColor: this.selectedColor);
}

class ButtonState extends State<ButtonWidget> {
  String text;
  MaterialColor selectedColor;
  int _flexValue = 1;

  ButtonState({this.text, this.selectedColor});

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: _flexValue,
      child: FlatButton(
        color: selectedColor,
        child: Text(
          text,
        ),
        onPressed: () {
          setState(() {
            _flexValue = 2;
          });
        },
      ),
    );
  }
}

我试图找到一种方法,也许可以在一个数组或其他东西中跟踪所有这些。我搜索并发现 InheritedWidget 方法适用于继承的小部件,而不是同级小部件。

我确信有一种干净的方法可以做到这一点。但就是无法得到它。

最佳答案

不要试图在按钮本身中保持是否被选中的状态。如您所见,很难使 3 个按钮的状态保持同步。在小部件树上找到一个可以维护该状态一次的位置。在这种情况下,它在您的应用程序中。使应用程序有状态,以便它可以记住状态,然后您的按钮就不需要记住它。可以在构造函数中告知它们是被选中(大)还是未被选中(小)。

那么,按钮如何告诉父级它现在已成为选中的按钮?有多种策略,但它们都涉及:

  • 调用传递下来的方法
  • 在 InheritedWidget 上调用方法
  • 通过流发送消息
  • 等等

试试这个:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

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

class MyAppState extends State<MyApp> {
  int selected = 0;

  @override
  Widget build(BuildContext context) {
    return Directionality(
      textDirection: TextDirection.ltr,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          ButtonWidget(0, flexValue(0), 'Hello', Colors.yellow, onClick),
          ButtonWidget(1, flexValue(1), 'This is', Colors.red, onClick),
          ButtonWidget(2, flexValue(2), 'Button', Colors.blue, onClick),
        ],
      ),
    );
  }

  void onClick(int i) {
    setState(() {
      selected = i;
    });
  }

  int flexValue(int index) => (index == selected) ? 2 : 1;
}

class ButtonWidget extends StatelessWidget {
  ButtonWidget(this.index, this._flexValue, this.text, this.selectedColor,
      this.notifyClick);

  final Function notifyClick;
  final int index;
  final int _flexValue;
  final String text;
  final MaterialColor selectedColor;

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: _flexValue,
      child: FlatButton(
        color: selectedColor,
        child: Text(
          text,
        ),
        onPressed: () {
          notifyClick(index);
        },
      ),
    );
  }
}

关于mobile - Flutter - 通知 Column 内的兄弟小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55543070/

相关文章:

asp.net - 为什么代码会被 ASP 触发一次 :ImageButton Click not Triggered

html - Iphone 上的图像比我指定的大 2 倍

flutter - 通知图标未显示在 flutter android 应用程序 local_notification flutter 中

ios - 在动画期间观察 UIView 框架的变化

javascript - iPad/Android 平板电脑上的 HTML5 Canvas(游戏)

android - 2014 年最佳移动检测(Rails 和 JS)

flutter - 为什么我们需要调用 `dispose` 方法,而成员是已处置类的属性?

flutter - Flutter:区分小部件参数= null和未设置的参数

java - 如何创建自己的事件。当传感器的值发生变化时如何调用方法?

java - 在避免 java 中的 instanceof 运算符的同时观察多个可观察对象?