如何从父浮动动作按钮调用另一个类的initstate()方法?

时间:2019-12-06 13:01:13

标签: flutter dart

我有一个带有2个标签和一个浮动操作按钮的标签。 我有一个单独的课程来填充我的标签栏视图。 我想更改或从父浮动操作按钮按下的方法在该tabbarview中调用一个方法。 下面,我通过简单的文本和行为简化了场景。 通过滑动选项卡,将调用第二个initstate()方法,调试器将在

处停止
strTitle=widget.txt;

我需要在按下按钮时进行同样的操作。 如果flutter可以在刷卡时自动调用initstate,为什么我不能这样做。应该有一些我不知道的方法。

import 'package:flutter/material.dart';

class MyTabbedPage extends StatefulWidget {
  const MyTabbedPage({Key key}) : super(key: key);
  @override
  _MyTabbedPageState createState() => _MyTabbedPageState();
}

class _MyTabbedPageState extends State<MyTabbedPage>
    with SingleTickerProviderStateMixin {
  int i = 0;
  final List<Tab> myTabs = <Tab>[
    Tab(
      text: 'LEFT',
    ),
    Tab(text: 'RIGHT'),
  ];

  TabController _tabController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(vsync: this, length: myTabs.length);
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  pressed() {
    i = i + 1;
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(
          controller: _tabController,
          tabs: myTabs,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: pressed,
        child: Icon(Icons.power_settings_new),
      ),
      body: TabBarView(
        controller: _tabController,
        children: myTabs.map((Tab tab) {
          String label = tab.text.toLowerCase();
          if (label.contains("right")) {
            label = "Modified Right";
          }
          return Tabbarview1(label + ' ' + i.toString());
        }).toList(),
      ),
    );
  }
}

class Tabbarview1 extends StatefulWidget {
  final String txt;
  Tabbarview1(this.txt);
  @override
  _Tabbarview1State createState() => _Tabbarview1State();
}

class _Tabbarview1State extends State<Tabbarview1> {
  String strTitle = "0";
  @override
  void initState() {
    super.initState();
    strTitle = widget.txt;
  }

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

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Text(strTitle),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:0)

小部件更新后,您还需要更新其状态:

class _Tabbarview1State extends State<Tabbarview1> {
  ...

  @override
  void didUpdateWidget(Tabbarview1 oldWidget) {
    super.didUpdateWidget(oldWidget);

    if (oldWidget.txt != widget.txt) {
      setState(() {
        strTitle = widget.txt;
      });
    }
  }

来回滑动是可行的,因为小部件已被处置并以新值再次初始化。