【问题标题】:How to call initstate() method of another class from parent floating action button?如何从父浮动操作按钮调用另一个类的 initstate() 方法?
【发布时间】:2019-12-06 13:01:13
【问题描述】:

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

处停止
strTitle=widget.txt;

我需要在按下按钮时发生同样的事情。 如果颤振可以在滑动时自动调用 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),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

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

    class _Tabbarview1State extends State<Tabbarview1> {
      ...
    
      @override
      void didUpdateWidget(Tabbarview1 oldWidget) {
        super.didUpdateWidget(oldWidget);
    
        if (oldWidget.txt != widget.txt) {
          setState(() {
            strTitle = widget.txt;
          });
        }
      }
    

    来回滑动可以工作,因为小部件被释放并再次使用新值初始化。

    【讨论】:

    • 这有效,但适用于每项活动。我希望代码仅在我按下按钮时执行,而不是在滑动或键盘打开/关闭活动时执行。
    • @Faiz 您可以检查txt 字段是否更改为:if (oldWidget.txt != widget.txt) ...,然后才调用 setState
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多