- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我几乎是Flutter
的新手,正在尝试开发聊天应用程序。每当用户发送消息时,都应更改State
的Widget
,并且消息应显示在Listview
中。
这种情况是在按Widget State
时Button
不变。但是,如果我对应用程序进行Hot Reload
更改,则会更改State
的Widget
并显示消息。我在 View 中使用两个Widgets
,并且在setState()
中调用了Child Widget
方法。如何从State
刷新Widget
的Child Widget
。
请查看我的代码,并让我知道解决方案。提前致谢。
父小部件:
class ChatScreen extends StatefulWidget {
@override
ChatState createState() => ChatState();
}
class ChatState extends State<ChatScreen> {
static const int _logout = 303;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(Strings.appNameString),
actions: <Widget>[
//IconButton(icon: Icon(Icons.add), onPressed: () {}),
PopupMenuButton<int>(
icon: Icon(Icons.more_vert),
elevation: 10,
//padding: EdgeInsets.all(5),
offset: Offset(0, 100),
itemBuilder: (BuildContext context) => [
PopupMenuItem(child: Text("Logout"), value: _logout,),
//PopupMenuDivider(height: 5,),
],
onSelected: (value) {
switch(value) {
case _logout: {
MyClass.SignOutofGoogle();
} break;
default: break;
}
},
),
],
),
body: Column(
// crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisSize: MainAxisSize.max,
// mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Flexible(child: ListView.builder(
padding: new EdgeInsets.all(8.0),
reverse: true,
itemBuilder: (_, int index) => MyClass.messages[index],
itemCount: MyClass.messages.length)),
Container(
child: ChatWidget()),
],
),
);
}
}
class ChatWidget extends StatefulWidget {
@override
ChatWidgetState createState() => ChatWidgetState();
}
class ChatWidgetState extends State<ChatWidget> {
final TextEditingController _textController = new TextEditingController();
Widget _buildTextComposer() {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 10.0),
child: Align(
child: Column(
children: <Widget>[
Divider(height: 5.0, color: Colors.lightBlue,),
Container(
height: 6.8 * SizeConfig.heightSizeMultiplier,
child: Row(
children: <Widget>[
Container(
child: IconButton(
icon: Icon(Icons.add_photo_alternate),
iconSize: 6.7 * SizeConfig.imageSizeMultiplier,
color: Colors.lightBlueAccent,
onPressed: () {}),
),
Flexible(
child: TextField(
controller: _textController,
onSubmitted: _handleSubmitted,
decoration: InputDecoration.collapsed(
hintText: "Send a message"),
),
),
Container(
margin: EdgeInsets.symmetric(horizontal: 4.0),
child: IconButton(
icon: Icon(Icons.send),
iconSize: 6.7 * SizeConfig.imageSizeMultiplier,
color: Colors.lightBlueAccent,
onPressed: () {
_handleSubmitted(_textController.text);
}),
),
],
),
),
],
),
),
);
}
void _handleSubmitted(String text) {
_textController.clear();
ChatMessage message = new ChatMessage(
text: text,
);
setState(() {
MyClass.messages.insert(0, message);
});
}
@override
Widget build(BuildContext context) {
return _buildTextComposer();
}
}
class ChatMessage extends StatelessWidget {
final String text;
ChatMessage( {
this.text
});
@override
Widget build(BuildContext context) {
return new Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: Row(
//crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
//Text(MyClass.loggeduser.userName, style: Theme.of(context).textTheme.subhead),
Text("Sajib", style: Theme.of(context).textTheme.subhead),
Container(
margin: const EdgeInsets.only(top: 5.0),
child: Text(text),
),
],
),
Container(
margin: const EdgeInsets.only(right: 6.0, left: 12.0),
child: CircleAvatar(
//backgroundImage: NetworkImage(MyClass.loggeduser.photoUrl)),
child: Icon(Icons.account_circle, color: Colors.lightBlueAccent,)),
),
],
),
);
}
}
最佳答案
首先,@ Darish是正确的,因为您可能应该使用另一种状态管理系统,但要问“如何从子窗口小部件刷新窗口小部件的状态”这一问题。我将提供两个简单的答案:
_handleSubmitted
方法移至ChatState
小部件,并将其传递给ChatWidget
:class ChatState extends State<ChatScreen> {
...
@override
Widget build(BuildContext context) {
...
Container(
child: ChatWidget(onMessageSubmitted: this._handleSubmitted)),
...
}
void _handleSubmitted(String text) {
ChatMessage message = new ChatMessage(
text: text,
);
setState(() {
MyClass.messages.insert(0, message);
});
}
}
class ChatWidget extends StatefulWidget {
final Function(String) onMessageSubmitted;
ChatWidget({this.onMessageSubmitted});
@override
ChatWidgetState createState() => ChatWidgetState();
}
class ChatWidgetState extends State<ChatWidget> {
...
Widget _buildTextComposer() {
...
TextField(
controller: _textController,
onSubmitted: _handleSubmitted,
decoration: InputDecoration.collapsed(
hintText: "Send a message"),
),
...
IconButton(
...
onPressed: () {
_handleSubmitted(_textController.text);
},
),
...
}
void _handleSubmitted(String text) {
_textController.clear();
widget.onMessageSubmitted(text);
}
...
}
ChatState
访问您的ChatWidgetState
:class ChatScreen extends StatefulWidget {
...
static ChatState of(BuildContext context) => context.findAncestorStateOfType<ChatState>();
}
class ChatState extends State<ChatScreen> {
...
void onMessageSubmitted(String text) {
ChatMessage message = new ChatMessage(
text: text,
);
setState(() {
MyClass.messages.insert(0, message);
});
}
}
ChatWidget
中保持原样,但是在ChatWidgetState
中,像下面这样更改_handleSubmitted
方法:void _handleSubmitted(String text) {
_textController.clear();
ChatScreen.of(context).onMessageSubmitted(text);
}
关于flutter - Flutter-小部件的状态未更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60187297/
我正在尝试从flutter应用程序构建apk,但出现此错误: Note: /mnt/Software/Linux/Flutter/flutter/.pub-cache/hosted/pub.dartl
我有一个名为 X 的较大应用程序,还有另一个名为 Y 的较小应用程序。他们现在彼此分开,并且工作正常。我想将应用程序 Y 集成到 X 中。我想将 Y 的代码放入 X 项目中,但它们应该有不同的 Mai
在android Studio中选择Create New Flutter Project,出现如下4个选项。 Flutter 应用程序 Flutter 插件 Flutter 包 flutter 模块
我看到我的 flutter 项目生成了一个文件 ios/Flutter/Flutter.podspec ,这个文件有什么用? 如果它与生成的 Flutter.framework 有关? 我应该将它包含
我尝试过的 在包含flutter SDK的位置添加/编辑.bash_profile.rtf文件。 导出PATH = / Users / temur / Documents / Projects / F
Flutter 日志会打印数千个详细/垃圾邮件日志。 我正在尝试调试一个复杂的应用程序,但是打印太冗长了,以至于我很难找到我自己打印的东西。 有没有办法禁用详细? 就像是: Logger.level.
在flutter 1.22更新之后,我在Lineargradient colors属性中遇到错误,这给我一个错误,即未定义名称colors参数。.在Android中更新flutter和flutter插
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
Flutter 1.0 发布后,我正在按照步骤搭建 Flutter 开发环境。 在步骤中(如所附屏幕截图所示),它说要更新 $PATH 两次,一次使用 flutter 工具的路径 export PAT
我有一个用 flutter 编写的移动应用程序,我想将其转换为 flutter_web 应用程序(集成 flutter_web 尚不可用)。我目前遇到包裹问题。 我已按照本网站中列出的说明进行操作 h
如何向我的 Flutter 路由添加自定义转换?这是我目前的路线结构。 class MyApp extends StatelessWidget { // This widget is the
我正在尝试通过 URL 在 webview 中显示网页。我试过 flutter_webview_plugin 插件,但是当我在浏览器上运行项目时它不起作用。 在 flutter web applica
我正在使用 animatedContainer 在按下按钮时显示 listView.builder()。这是一个要显示的简单子(monad)列表,但问题是我不知道 ListView 构建器的高度会传递
我目前正在我的应用程序中制作渐变背景动画......我正在使用 lottie 动画的帮助下这样做!我试图将它封装在一个容器中并成功地做到了。但是有一个问题,尽管我将高度更改为大于 2000 的东西,但
美好的一天! 我无法弄清楚如何使用 google 标签管理器设置 flutter。我找到了 this package包括标签管理器 api。但是我不知道如何正确配置它。 (在网络上我只需要复制粘贴一个
我的购物车模型如下 class Cart { String description; double unitCost; double amount; int quantity; S
在 Flutter 应用程序中,我想为在线托管的资源(图像、视频等)实现缓存。 我希望它能在原生平台 (Android/iOS)(例如使用文件系统)和网络(例如使用 IndexedDB)上运行。 Fl
我写了一个页面,在顶部一切都很好,应该是这样。在底部我有一个事件的历史。我的容器的宽度是自动确定的(取决于屏幕的宽度),而高度 - 不,在不同的设备上有不同的高度(底部的缩进是不同的)。是否可以自动确
我正在处理一个页面,其中有一些字段,例如 textfield 和 slider。在页面的末尾必须有一个用于进行下一步的按钮,该按钮被包裹在 Align 中以在页面之间具有固定位置。 另一方面,resi
我是一名优秀的程序员,十分优秀!