Flutter 在flatter中设置/获取有状态小部件的值

Flutter 在flatter中设置/获取有状态小部件的值,flutter,Flutter,我的小部件中有一个文本字段。当我从服务器得到一些更新时,我想刷新它。现在我知道了 setState(() { _msg = "new message"; }); 它重建了我的整个小部件。我想做什么 _msg.set("new message"); 它应该在_msg小部件内调用setState并仅重建_msg 有办法做到这一点吗?确保您使用的是有状态小部件。这将允许您使用setState((){})更新小部件状态 当您调用setState((){})时,它将重建它所在的有状

我的小部件中有一个文本字段。当我从服务器得到一些更新时,我想刷新它。现在我知道了

  setState(() {
    _msg = "new message";
  });
它重建了我的整个小部件。我想做什么

  _msg.set("new message");
它应该在_msg小部件内调用setState并仅重建_msg


有办法做到这一点吗?

确保您使用的是有状态小部件。这将允许您使用
setState((){})
更新小部件状态

当您调用
setState((){})
时,它将重建它所在的有状态小部件。整个小部件将得到重建。别担心,重新构建整个小部件。例如:

@override
  Widget build(BuildContext context) { .... will get rebuilt ....}
看起来_msg是一个类型字符串。如果要更新字符串文本,调用
setState((){})
将实现此目标。下面是一个快速示例,您可以通过打印看到AppBar标题和控制台中的文本字段发生更改。快乐编码

import 'package:flutter/material.dart';

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  String _msg = "first message";
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MyWidget: _msg = $_msg'),
      ),
      backgroundColor: Colors.white,
      floatingActionButton: FloatingActionButton(onPressed: (){
        print('before setState _msg = $_msg');
        setState(() {
          _msg = 'second message';
          print('after setState _msg = $_msg');
        });
      }),
    );
  }
}
导入“包装:颤振/材料.省道”;
类MyWidget扩展了StatefulWidget{
@凌驾
_MyWidgetState createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
字符串_msg=“第一条消息”;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:Text('MyWidget:_msg=$_msg'),
),
背景颜色:Colors.white,
浮动操作按钮:浮动操作按钮(按下时:(){
打印('设置状态之前_msg=$_msg');
设置状态(){
_msg=‘第二条消息’;
打印('setState\u msg=$\u msg'之后);
});
}),
);
}
}

确保您使用的是有状态小部件。这将允许您使用
setState((){})
更新小部件状态

当您调用
setState((){})
时,它将重建它所在的有状态小部件。整个小部件将得到重建。别担心,重新构建整个小部件。例如:

@override
  Widget build(BuildContext context) { .... will get rebuilt ....}
看起来_msg是一个类型字符串。如果要更新字符串文本,调用
setState((){})
将实现此目标。下面是一个快速示例,您可以通过打印看到AppBar标题和控制台中的文本字段发生更改。快乐编码

import 'package:flutter/material.dart';

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  String _msg = "first message";
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MyWidget: _msg = $_msg'),
      ),
      backgroundColor: Colors.white,
      floatingActionButton: FloatingActionButton(onPressed: (){
        print('before setState _msg = $_msg');
        setState(() {
          _msg = 'second message';
          print('after setState _msg = $_msg');
        });
      }),
    );
  }
}
导入“包装:颤振/材料.省道”;
类MyWidget扩展了StatefulWidget{
@凌驾
_MyWidgetState createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
字符串_msg=“第一条消息”;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:Text('MyWidget:_msg=$_msg'),
),
背景颜色:Colors.white,
浮动操作按钮:浮动操作按钮(按下时:(){
打印('设置状态之前_msg=$_msg');
设置状态(){
_msg=‘第二条消息’;
打印('setState\u msg=$\u msg'之后);
});
}),
);
}
}

不是直接的,不是。实际上重建并不是一个低效的操作。状态是一个简单的数据结构,对于其中未更改的部分,不会重新创建它们背后的实际UI元素。如果你真的因为某种原因想要摆脱重建,我认为提供者小部件有办法让相关小部件监听更改。不是直接的,不是。实际上重建并不是一个低效的操作。状态是一个简单的数据结构,对于其中未更改的部分,不会重新创建它们背后的实际UI元素。如果出于某种原因,您真的想摆脱重建,我认为提供者小部件有办法让相关小部件侦听更改。这就是我现在正在做的。如果这是正确答案,请将答案标记为正确。事实并非如此。这就是我在问这个问题之前所做的。你能在你的问题中提供更多的代码以便so社区能够帮助你吗?这就是我现在正在做的。如果这是正确的答案,请将答案标记为正确。它不是。这就是我在问这个问题之前所做的。你能在你的问题中提供更多的代码以便so社区能够帮助你吗?