Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 方法setState()未更新UI(颤振)_Flutter_Dart_Flutter Layout_Setstate_Flutter Widget - Fatal编程技术网

Flutter 方法setState()未更新UI(颤振)

Flutter 方法setState()未更新UI(颤振),flutter,dart,flutter-layout,setstate,flutter-widget,Flutter,Dart,Flutter Layout,Setstate,Flutter Widget,我的主屏幕是一个脚手架,其主体是一个ListView,底部是一个浮动操作按钮。操作按钮将用户带到第二个屏幕,在该屏幕上,用户可以在文本输入中键入文本,然后按save。save按钮调用主屏幕上的一个方法,将文本添加到ListView所基于的列表变量中。问题是:列表变量正在更新(我可以在日志上看到),但是setState没有更新ListView。我做错了什么 以下是主屏幕上的代码: import 'package:flutter/material.dart'; import 'addCounter.

我的主屏幕是一个脚手架,其主体是一个ListView,底部是一个浮动操作按钮。操作按钮将用户带到第二个屏幕,在该屏幕上,用户可以在文本输入中键入文本,然后按save。save按钮调用主屏幕上的一个方法,将文本添加到ListView所基于的列表变量中。问题是:列表变量正在更新(我可以在日志上看到),但是setState没有更新ListView。我做错了什么

以下是主屏幕上的代码:

import 'package:flutter/material.dart';
import 'addCounter.dart';

class Home extends StatefulWidget {
  @override
  HomeState createState() => HomeState();
}

class HomeState extends State<Home> {
    
    List lista = <Widget>[];

    void incrementLista(newItem) {
      print('$lista');
      setState(() {
        lista.add(Box('newItem'));
      });
    }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text('List of Counters'),
        backgroundColor: Colors.deepPurple[1000],
      ),
      body: Builder(
        builder: (context)=>
       Center(
            child: ListView(children: lista),
          ),),
      floatingActionButton: FloatingActionButton(
          backgroundColor: Colors.grey[1000],
          onPressed: () {
            Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => AddCounter(f: incrementLista)));
          },
          child: Icon(Icons.add, color: Colors.white)),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      bottomNavigationBar: BottomNavigationBar(
        unselectedItemColor: Colors.grey[700],
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.list),
            title: Text('Lista'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.insert_chart),
            title: Text('Gráfico'),
          ),
        ],
        selectedItemColor: Colors.blue,
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“addCounter.dart”;
类Home扩展了StatefulWidget{
@凌驾
HomeState createState()=>HomeState();
}
类HomeState扩展到State{
列表lista=[];
作废增量列表A(新建项){
打印(“$lista”);
设置状态(){
添加(框('newItem'));
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“计数器列表”),
背景颜色:颜色。深紫色[1000],
),
车身:建造商(
生成器:(上下文)=>
居中(
子项:ListView(子项:lista),
),),
浮动操作按钮:浮动操作按钮(
背景颜色:颜色。灰色[1000],
已按下:(){
导航器。推(
上下文
材料路线(
生成器:(context)=>AddCounter(f:incrementLista));
},
子项:图标(Icons.add,颜色:Colors.white)),
floatingActionButtonLocation:floatingActionButtonLocation.centerDocked,
底部导航栏:底部导航栏(
unselectedItemColor:颜色。灰色[700],
项目:常数[
底部导航气压计(
图标:图标(Icons.list),
标题:文本(“列表A”),
),
底部导航气压计(
图标:图标(图标。插入图表),
标题:文本(“Gráfico”),
),
],
选择编辑颜色:Colors.blue,
),
);
}
}
下面是addCounter.dart中的代码:

import 'package:flutter/material.dart';

class AddCounter extends StatefulWidget {
  final Function f;
  AddCounter({@required this.f});

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

class _AddCounterState extends State<AddCounter> {
  final myController = TextEditingController();

  @override
  void dispose() {
    myController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Add a counter'),
          backgroundColor: Colors.blue,
        ),
        body: Column(children: [
          Padding(
            padding: EdgeInsets.all(15),
            child: TextField(
              controller: myController,
              decoration: InputDecoration(
                  enabledBorder: OutlineInputBorder(
                      borderSide: BorderSide(color: Colors.blue, width: 2)),
                  hintText: 'Type a name for the counter'),
            ),
          ),
          RaisedButton(
            color: Colors.green,
            onPressed: () {
              widget.f(myController.text);
              Navigator.pop(context);
            },
            child: Text(
              'Save',
              style: TextStyle(color: Colors.white),
            ),
          )
        ]));
  }
}
导入“包装:颤振/材料.省道”;
类AddCounter扩展StatefulWidget{
最终函数f;
AddCounter({@required this.f});
@凌驾
_AddCounterState createState()=>\u AddCounterState();
}
类_AddCounterState扩展状态{
最终myController=TextEditingController();
@凌驾
无效处置(){
myController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“添加计数器”),
背景颜色:Colors.blue,
),
正文:列(子项:[
填充物(
填充:边缘设置。全部(15),
孩子:TextField(
控制器:myController,
装饰:输入装饰(
enabledBorder:OutlineInputBorder(
borderSide:borderSide(颜色:Colors.blue,宽度:2)),
hintText:“键入计数器名称”),
),
),
升起的按钮(
颜色:颜色。绿色,
已按下:(){
widget.f(myController.text);
Navigator.pop(上下文);
},
子:文本(
“保存”,
样式:TextStyle(颜色:Colors.white),
),
)
]));
}
}

我认为Box小部件的代码与此无关。这基本上是一张有标题的卡片。

@pskink给了我一个完美的答案。这是:


基本上,您不应该使用这样的小部件列表,数据层和表示层应该分开,相反,您应该只使用数据列表,有关更多信息,请参见共享AddCounter的代码。
lista
是一个小部件列表s?如果是这样,您需要在每次
setState
被称为dhi@theCaptainXgod时创建一个全新的列表!我刚刚分享了AddCounter的代码!基本上,您不应该使用这样的小部件列表,数据层和表示层应该分开,相反,您应该只使用数据列表,有关更多信息,请参见:@pskink,是的,
lista
是一个名为
Box
的自定义小部件列表。要创建
,我必须将
字符串
作为参数传递。