我已经解决了问题,但没有成功...
我的主页是带有两个标签的标签栏的有状态类。第一个选项卡有一些来自全局变量的文本和几个文本字段,这些文本字段也预填充了全局变量。 第二个选项卡有一个按钮,它调用 setstate 来更改变量,这些变量在第一个选项卡上使用,然后动画到第一个选项卡。 我的问题是第一个选项卡文本不会更改为新值。同时文本字段将具有新值。如果我在第一个选项卡上返回文本之前添加打印命令,代码将打印出新值,但未设置文本状态,同时将设置文本字段状态。 暂时无法添加代码,但我希望我能很好地描述 mu 问题。
谢谢!
答案 0 :(得分:0)
使用简单的状态管理解决方案。两个选项卡都可以收听和修改您想要的值。没有代码很难演示。但是您不能简单地从另一个小部件更改小部件的状态,使用提供程序会更容易。
答案 1 :(得分:0)
要更新和收听更改,请使用 StreamController
和 StreamBuilder
。您可以将第一个选项卡与 SingleTickerProviderStateMixin
结合放在小部件中以防止它重新加载。我创建了一个简单的应用程序用于演示:
完整示例:
main.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);
}