【问题标题】:Pass variables between widgets flutter [duplicate]在小部件之间传递变量颤动[重复]
【发布时间】:2021-01-04 14:04:17
【问题描述】:

我有以下小部件:

class GenesTableTabState extends State<GenesTableTab> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DataTable of Gene Lists'),
        centerTitle: true,
        backgroundColor: Colors.greenAccent,
      ),
      body: GenesTable(this),
      persistentFooterButtons: [
        RaisedButton(
          onPressed: _onLoadCSV,
          child: Text('Load CSV'),
        ),
        RaisedButton(
          onPressed: _onExportCSV,
          child: Text('Export CSV'),
        ),
        RaisedButton(
          onPressed: () {},
          child: Text('Hypergeometric test'),
        ),
        RaisedButton(
          onPressed: () {
            Navigator.of(context).push(
                MaterialPageRoute(builder: (context) => VennDiagramWidget()));
          },
          child: Text('Show venn diagram'),
        )
      ],
    );
  }
}

GenesTable 是我从另一个文件导入的另一个小部件,我需要在维恩图按钮的 on_pressed 属性中使用其中一个变量(最后一个 RaisedButton)。

有没有办法将变量从GenesTable 传递到这个小部件?

编辑:

另外,我必须对GenesTable 进行哪些更改?

class GenesTable extends StatefulWidget {
  final GenesTableTabState genesTableTabState;

  GenesTable(this.genesTableTabState);

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

class _GenesTableState extends State<GenesTable> {
  bool sort = false;
  int lastRowIndex = 1;

  List<GenesListObjIndexed> selectedGeneLists = [];
...
..

编辑 2:

selectedGeneLists是我要传递的变量

我想以这种方式使用它:

RaisedButton(
          onPressed: () {
            widget.selectedGeneLists.isEmpty
                ? null
                : Navigator.of(context).push(MaterialPageRoute(
                    builder: (context) => VennDiagramWidget()));
          },

当我点击这个按钮时,我得到NoSuchMethodError: invalid member on null: 'isEmpty'

【问题讨论】:

  • widget.selectedGeneLists.isEmpty 这里 isEmpty 不在列表中,您可以使用它的长度属性
  • 如何将selectedGeneLists 视为该文件中的列表?它被定义为另一个文件@AbhishekGhaskata 中的列表
  • 如果那是另一个文件,那么你可以将它传递给构造函数,并使用 as 关键字进行类型转换。
  • @nvoigt 如果我想在两个有状态小部件之间传递数据,该解决方案是否可行?
  • 只要改变另一个小部件的输入并在第一个小部件的回调中调用setState,它就应该。这就是颤振小部件的工作方式,这就是它们构建您已经使用的所有 onValueChangeonTaponPressed 方法的方式。

标签: flutter dart


【解决方案1】:

是的,您可以使用这样的构造函数来实现它。

class SecondPage extends StatefulWidget {
  String title;
  SecondPage({this.title}):super(key: key);
  @override
  State<StatefulWidget> createState() {
    return SecondPageState(this.title);
  }
}
class SecondPageState extends State<SecondPage> {
  @override
  Widget build(BuildContext context) {
   return Scaffold(
    appBar: AppBar(
    //now you have passing variable
    title: Text(widget.title),
   ),
   ...
  }

然后你可以使用构造函数传递值。

Navigator.of(context).push(MaterialPageRoute(builder:(context)=>SecondPage(title:'something')));

【讨论】:

  • 如果这些是我所做的唯一更改,我会收到一个错误,请查看我的编辑
  • 这是错误的方向。 OP 想要 out 获取数据,而不是 in 传递它。
【解决方案2】:

你可以通过构造函数来传递它

class GenesTableTab extends StatefulWidget {
  final String url;

  const GenesTableTab({Key key, this.url}) : super(key: key);
  @override
  _GenesTableTabState createState() => _GenesTableTabState();
}

class _GenesTableTabState extends State<GenesTableTab> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

【讨论】:

  • 如果这些是我所做的唯一更改,我会收到一个错误,请查看我的编辑
  • 请查看编辑后的答案@EliranTurgeman
  • 查看第二次编辑
  • 这是错误的方向。 OP 想要 out 获取数据,而不是 in 传递它。
  • 那么他应该使用任何状态管理技术。
猜你喜欢
  • 2019-09-14
  • 1970-01-01
  • 2011-04-21
  • 2020-12-11
  • 2012-07-19
  • 2016-12-03
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
相关资源
最近更新 更多