Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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()正在工作,但未重新渲染_Flutter_Dart_State_Setstate_State Management - Fatal编程技术网

Flutter 颤振:setState()正在工作,但未重新渲染

Flutter 颤振:setState()正在工作,但未重新渲染,flutter,dart,state,setstate,state-management,Flutter,Dart,State,Setstate,State Management,我通过制作一个小新闻应用程序来学习颤振。每个选项卡都有一个新闻文章小部件列表,其中包含图像、标题、描述、“了解更多”链接按钮,以及用于扩展或收缩小部件以包含或隐藏描述的按钮 我现在的问题是关于扩展部分。当我按下按钮展开小部件时,将调用setState(),并切换我的布尔值\u expanded。但是,我认为它不会被重新呈现,因为小部件不会扩展。正如您在我的代码中看到的,我在列表中有一个内联条件作为小部件,形式为\u expanded?扩展后的选项:未扩展时的选项。我已经通过放置验证了小部件是我想

我通过制作一个小新闻应用程序来学习颤振。每个选项卡都有一个新闻文章小部件列表,其中包含图像、标题、描述、“了解更多”链接按钮,以及用于扩展或收缩小部件以包含或隐藏描述的按钮

我现在的问题是关于扩展部分。当我按下按钮展开小部件时,将调用
setState()
,并切换我的布尔值
\u expanded
。但是,我认为它不会被重新呈现,因为小部件不会扩展。正如您在我的代码中看到的,我在列表中有一个内联条件作为小部件,形式为
\u expanded?扩展后的选项:未扩展时的选项
。我已经通过放置
验证了小部件是我想要的在内联条件前面,它们会显示它们应该显示的内容,所以我被卡住了

目前我唯一的想法是,它可能与状态是不可变的这一事实有关,也许我正在尝试更改状态,而不是替换和重新渲染。有什么想法吗?谢谢

我试图只包含必要的内容,但下面是一些代码:

class NewsList extends StatefulWidget {
  NewsList({this.keyword});
  final String keyword;

  @override
  createState() => NewsListState(keyword: keyword);
}

class NewsListState extends State<NewsList> {
  NewsListState({this.imageURLs, this.titles, this.texts, this.keyword});
  final List<String> imageURLs;
  final List<String> titles;
  final List<String> texts;
  final String keyword;

  List<NewsArticle> _newsArticles = List<NewsArticle>();

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

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

  void _populateNewsArticles() {
    WebService().load(NewsArticle().all(keyword)).then((newsArticles) => {
          setState(() {
            _newsArticles = newsArticles;
          })
        });
  }

  Widget _buildNewsArticles(BuildContext build, int index) {
    bool _expanded = false;
    return Container(
      decoration: BoxDecoration(
          borderRadius: BorderRadius.all(const Radius.circular(10)),
          color: Colors.white,
          boxShadow: [
            BoxShadow(
                color: Colors.grey[300],
                blurRadius: 20,
                spreadRadius: 3,
                offset: Offset(5, 5))
          ]),
      child: Column(
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                _newsArticles[index].urlToImage == null
                    ? AssetImage(Constants.NEWS_PLACEHOLDER_IMAGE_ASSET_URL)
                    : CachedNetworkImage(
                        imageUrl: _newsArticles[index].urlToImage),
                Padding(padding: const EdgeInsets.symmetric(vertical: 5)),
                Text(
                  _newsArticles[index].title,
                  textAlign: TextAlign.left,
                  style: TextStyle(
                    fontSize: 25,
                    fontWeight: FontWeight.w700,
                    height: 0.8,
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.fromLTRB(4, 15, 4, 0),
                  child: Platform.isIOS
                      ? CupertinoButton.filled(
                          child: Text(
                            "Learn More",
                            style: TextStyle(fontSize: 17),
                          ),
                          onPressed: () =>
                              navigateToUrl(_newsArticles[index].url),
                          pressedOpacity: 0.6,
                        )
                      : RaisedButton(
                          onPressed: () =>
                              navigateToUrl(_newsArticles[index].url),
                          color: Color.fromRGBO(0, 122, 255, 1.0),
                          animationDuration: Duration(milliseconds: 1000),
                          child: Text(
                            "Learn More",
                            style: TextStyle(fontSize: 16, color: Colors.white),
                          ),
                        ),
                ),
                !_expanded ? Text("test description") : Container(),
                !_expanded
                    ? IconButton(
                        icon: Icon(Icons.keyboard_arrow_up),
                        onPressed: () => setState(() {
                          _expanded = !_expanded;
                        }),
                      )
                    : IconButton(
                        icon: Icon(Icons.keyboard_arrow_down),
                        onPressed: () {
                          setState(() {
                            debugPrint(_expanded.toString());
                            _expanded = !_expanded;
                            debugPrint(_expanded.toString());
                          });
                        },
                      ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  Widget build(BuildContext context) {
    return ListView.separated(
      separatorBuilder: (BuildContext context, int index) =>
          Padding(padding: const EdgeInsets.symmetric(vertical: 15)),
      padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 30),
      itemBuilder: _buildNewsArticles,
      itemCount: _newsArticles.length,
    );
  }
}
类新闻列表扩展StatefulWidget{
新闻列表({this.keyword});
最后一个字符串关键字;
@凌驾
createState()=>NewsListState(关键字:关键字);
}
类NewsListState扩展了状态{
NewsListState({this.imageURLs,this.titles,this.text,this.keyword});
最终列表;
最后名单标题;
最后清单文本;
最后一个字符串关键字;
List _newsacts=List();
@凌驾
void initState(){
super.initState();
_populateNewsArticles();
}
@凌驾
无效处置(){
super.dispose();
}
void _populateNewsArticles(){
WebService().load(新闻文章().all(关键字))。然后((新闻文章)=>{
设置状态(){
_新闻文章=新闻文章;
})
});
}
Widget\u buildNewsArticles(BuildContext构建,int索引){
bool _expanded=false;
返回容器(
装饰:盒子装饰(
borderRadius:borderRadius.all(常数半径圆形(10)),
颜色:颜色,白色,
boxShadow:[
箱形阴影(
颜色:颜色。灰色[300],
半径:20,
扩展半径:3,
偏置:偏置(5,5))
]),
子:列(
儿童:[
填充物(
填充:常量边集。对称(垂直:10,水平:10),
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
_新闻文章[索引].urlToImage==null
资产估值(常数、新闻、占位符、图像、资产、URL)
:CachedNetworkImage(
图像URL:_新闻文章[index].urlToImage),
填充(填充:常量边集。对称(垂直:5)),
正文(
_新闻文章[索引]。标题,
textAlign:textAlign.left,
样式:TextStyle(
尺寸:25,
fontWeight:fontWeight.w700,
高度:0.8,
),
),
填充物(
填充:从LTRB(4,15,4,0)开始的常数边集,
子:Platform.isIOS
?CupertinoButton.filled(
子:文本(
“了解更多”,
样式:TextStyle(字体大小:17),
),
按下:()=>
导航url(_新闻文章[index].url),
加压能力:0.6,
)
:升起按钮(
按下:()=>
导航url(_新闻文章[index].url),
颜色:color.fromRGBO(0,122,255,1.0),
animationDuration:持续时间(毫秒:1000),
子:文本(
“了解更多”,
样式:TextStyle(字体大小:16,颜色:Colors.white),
),
),
),
!\u扩展文本(“测试描述”):容器(),
!\u扩大
?图标按钮(
图标:图标(图标。键盘箭头向上),
按下时:()=>设置状态(){
_扩展=!\u扩展;
}),
)
:图标按钮(
图标:图标(图标。键盘箭头向下),
已按下:(){
设置状态(){
debugPrint(_expanded.toString());
_扩展=!\u扩展;
debugPrint(_expanded.toString());
});
},
),
],
),
),
],
),
);
}
小部件构建(构建上下文){
返回ListView.separated(
separatorBuilder:(BuildContext上下文,int索引)=>
填充(填充:常量边集。对称(垂直:15)),
填充:常量边集。对称(水平:30,垂直:30),
itemBuilder:_buildNewsArticles,
itemCount:_newsactions.length,
);
}
}

\u expanded
是在
buildNewsArticles
方法中定义和初始化的局部变量。因此,每次运行
buildNewsArticles
时,
\u expanded
被初始化为false


您应该将
\u expanded
移出该方法,使其成为NewsListState的成员变量。

这种方法有效。也许问题只是因为它是一个新闻列表小部件,而不是