android - Flutter - 无法从父小部件更改子状态

标签 android ios flutter dart flutter-widget

问题:

我有一个父部件 SnippetTestEditor 和一个有状态的子部件 NoteTab。如果按下父小部件中的按钮,子小部件应该得到更新。

两个类都有一个 bool _editMode。我通过构造函数将 bool 从父小部件传递到子小部件。根据我的理解,我需要在父小部件中调用 setState() 并更改 setState() 中的 bool。此更改应自动反射(reflect)在子小部件中。但它不是......

那么我怎样才能让子部件改变呢?

代码:

class _SnippetTestEditorState extends State<SnippetTestEditor> with SingleTickerProviderStateMixin {

  bool _editMode = true;
  ...

  @override
  void initState() {
    super.initState();

    _tabs = List();
    _tabNames = List();

    List<CodeSnippet> codeSnippets = this.widget._note.codeSnippets;
    for(CodeSnippet snippet in codeSnippets){
      _tabs.add(CodeTab(_editMode);

    ...
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
    ...
    body: TabBarView(
          controller: _tabController,
          children: _tabs
    ),
    ...
    actions: <Widget>[ 
       IconButton(
          icon: Icon(Icons.check),
          onPressed: (){
            setState(() {
              _editMode = false;
            });
          },
        )
    ...

class CodeTab extends StatefulWidget{

  bool _editMode;

  CodeTab(this._editMode);

  @override
  State<StatefulWidget> createState() => CodeTabState();

}

class CodeTabState extends State<CodeTab> {


  @override
  Widget build(BuildContext context) {

  return this.widget._editMode ? ...

最佳答案

发生这种情况是因为 _editMode 值仅在 initState() 中传递给 CodeTab 一次。因此,即使多次调用 build 方法,_tabs 中的 CodeTab 实例也不会更新。

您应该移动代码以在状态类中的方法中创建选项卡:

getTabs(){
 List<CodeSnippet> codeSnippets = widget._note.codeSnippets;
 for(CodeSnippet snippet in codeSnippets){
   _tabs.add(CodeTab(_editMode);
 return _tabs;
}

并在构建中使用 getTabs():

 body: TabBarView(
  controller: _tabController,
  children: getTabs(),
 ),

如果您对此解决方案有任何疑问,请在评论中告诉我。

关于android - Flutter - 无法从父小部件更改子状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59443590/

相关文章:

ios - 如何在应用程序委托(delegate)中调用时使 View Controller 动画化

ios - 如何测试一个对象在拆卸后是否会被释放

flutter - 如何在Dart中将Map <String,List <ClassObj >>更改为Map <String,List <Map >>?

flutter - 完全透明的库比蒂诺导航栏可能吗?

java - 多个 JSONObject 键和值不会保存到 Parse

android - WebView 显示带有 loadDataWithBaseURL 的源 html,而不是渲染 View

ios - 无法让 AdMob 或 iAd 横幅广告在 iOS ActionExtension 或 ShareExtension 中运行

android - 如何在 flutter 上制作按钮

android - 避免在 TextView 中硬编码字符串

java - 如何读取 AndroidManifest.xml(二进制)文件?