如何在颤振中的标签栏选项卡之间设置状态?

时间:2021-04-04 22:01:46

标签: flutter

我已经解决了问题,但没有成功...

我的主页是带有两个标签的标签栏的有状态类。第一个选项卡有一些来自全局变量的文本和几个文本字段,这些文本字段也预填充了全局变量。 第二个选项卡有一个按钮,它调用 setstate 来更改变量,这些变量在第一个选项卡上使用,然后动画到第一个选项卡。 我的问题是第一个选项卡文本不会更改为新值。同时文本字段将具有新值。如果我在第一个选项卡上返回文本之前添加打印命令,代码将打印出新值,但未设置文本状态,同时将设置文本字段状态。 暂时无法添加代码,但我希望我能很好地描述 mu 问题。

谢谢!

3 个答案:

答案 0 :(得分:0)

使用简单的状态管理解决方案。两个选项卡都可以收听和修改您想要的值。没有代码很难演示。但是您不能简单地从另一个小部件更改小部件的状态,使用提供程序会更容易。

答案 1 :(得分:0)

要更新和收听更改,请使用 StreamControllerStreamBuilder。您可以将第一个选项卡与 SingleTickerProviderStateMixin 结合放在小部件中以防止它重新加载。我创建了一个简单的应用程序用于演示:

完整示例:
ma​​in.dart

import 'dart:async';
import 'dart:math';

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(home: MyApp()));
}

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

class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
  final StreamController _streamController = StreamController<String>();
  TabController _tabController;

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

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sample App'),
      ),
      bottomNavigationBar: TabBar(
        controller: _tabController,
        labelColor: Colors.red,
        tabs: [Tab(text: 'Tab 1'), Tab(text: 'Tab 2')],
      ),
      body: TabBarView(
        controller: _tabController,
        children: [
          FirstTab(_streamController),
          Container(
            child: Center(
              child: TextButton(
                child: Text('Press me'),
                onPressed: () {
                  final _someText =
                      'Random number: ' + Random().nextInt(100).toString();
                  _streamController.add(_someText);
                  _tabController.animateTo(0);
                },
              ),
            ),
          ),
        ],
      ),
    );
  }
}

class FirstTab extends StatefulWidget {
  final StreamController _streamController;

  FirstTab(this._streamController);

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

class _FirstTabState extends State<FirstTab>
    with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true;

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Container(
      child: Center(
        child: StreamBuilder<String>(
            initialData: 'Empty text',
            stream: widget._streamController.stream,
            builder: (context, snapshot) {
              return Text(snapshot.data);
            }),
      ),
    );
  }
}

答案 2 :(得分:0)

我尝试了很多东西,现在我得到了奇怪的工作解决方案,可以满足我的需求。 如果我只是设置新变量,然后让 tabcontroller 为 dirst 页面设置动画,则不会设置页面状态,但如果我添加小延迟,则它可以像我想要的那样工作。如果有人能解释原因,我将不胜感激。

onPressed: () {
  setProduct();
  Timer(Duration(milliseconds: 100), animateToFirstPage);

}