Exception 从Scaffold中的body小部件更新AppBar标题

Exception 从Scaffold中的body小部件更新AppBar标题,exception,events,flutter,setstate,Exception,Events,Flutter,Setstate,我开始使用flatter并学习“Startup Name Generator”教程,还修改了代码来做一些不同的事情,遇到了一个我无法解决的问题。我希望AppBar标题显示_suggestions数组的大小,但无法使其正常工作,我尝试了许多不同的方法,但都无济于事,总是遇到一个例外,即在构建过程中尝试使用“setState()” 这就是我目前拥有的: import 'package:flutter/material.dart'; import 'package:english_words/engl

我开始使用flatter并学习“Startup Name Generator”教程,还修改了代码来做一些不同的事情,遇到了一个我无法解决的问题。我希望AppBar标题显示_suggestions数组的大小,但无法使其正常工作,我尝试了许多不同的方法,但都无济于事,总是遇到一个例外,即在构建过程中尝试使用“setState()”

这就是我目前拥有的:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Startup Name Generator',
      home: RandomWords(),
    );
  }
}

class RandomWordsState extends State<RandomWords> {
  static final _suggestions = <WordPair>[];
  final _biggerFont = const TextStyle(fontSize: 18.0);
  ValueNotifier<String> appBarTitleNotifier = ValueNotifier('Startup Name Generator: 0');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(title: ValueListenableBuilder<String>(
        valueListenable: appBarTitleNotifier,
        builder: (context,value,child) {
          return Text(value);
        }
      )),
      body: _buildSuggestions(),
    );

  }

  Widget _buildSuggestions() {
    var blder = ListView.builder(
      padding: const EdgeInsets.all(16.0),
      itemBuilder: /*1*/ (context, i) {
        if (i.isOdd) return Divider(); /*2*/

        final index = i ~/2; /*3*/
        if (index >= _suggestions.length) {
          _suggestions.addAll(generateWordPairs().take(10)); /*4*/

/**** THIS NEXT LINE CAUSES THE ISSUE ****/
          appBarTitleNotifier.value = 'Startup Name Generator: ' + _suggestions.length.toString();


        }
        return _buildRow(_suggestions[index],index);
      },



    );
    return blder;
  }

  Widget _buildRow(WordPair pair, int i) {

    return ListTile(
      title: Text(
        pair.asPascalCase + ': ' + i.toString(),
        style: _biggerFont,
      ),
    );
  }


}

class RandomWords extends StatefulWidget {
  @override
  RandomWordsState createState() => RandomWordsState();
}
导入“包装:颤振/材料.省道”;
导入“package:english_words/english_words.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“启动名称生成器”,
home:RandomWords(),
);
}
}
类RandomWordsState扩展状态{
静态最终建议=[];
final _biggerFont=const TextStyle(字体大小:18.0);
ValueNotifier-appBarTitleNotifier=ValueNotifier(“启动名称生成器:0”);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:新appBar(标题:ValueListenableBuilder(
valueListenable:appBarTitleNotifier,
生成器:(上下文、值、子级){
返回文本(值);
}
)),
正文:_buildSuggestions(),
);
}
小部件_buildSuggestions(){
var blder=ListView.builder(
填充:常数边集全部(16.0),
itemBuilder:/*1*/(上下文,i){
if(i.isOdd)返回分隔符();/*2*/
最终指数=i~/2;/*3*/
如果(索引>=\u建议长度){
_建议.addAll(generateWordPairs().take(10));/*4*/
/****下一行导致了问题****/
appBarTitleNotifier.value='启动名称生成器:'+\u建议.length.toString();
}
返回_buildRow(_建议[索引],索引);
},
);
返回blder;
}
Widget\u buildRow(字对,int i){
返回列表块(
标题:正文(
pair.asPascalCase+':'+i.toString(),
风格:_biggerFont,
),
);
}
}
类RandomWords扩展了StatefulWidget{
@凌驾
RandomWordsState createState()=>RandomWordsState();
}
在对事件进行了一些研究之后,我使用了ValueNotifier和listener,但与我在ListView itemBuilder中手动使用setState()调用时的情况相同(问题似乎出在这里;从ListView itemBuilder中调用/更新AppBar标题)


我还没有找到解决办法,所以我在问。很抱歉,如果已经回答了这个问题,但我找不到解决方案。

我看不出
setState()
在代码中的位置,但我只是尝试了示例默认项目,通过按钮手动更改AppBar标题没有问题,不需要侦听器。setState由valueNotifier的值触发。是的,用一个按钮就可以很容易地让它工作,但这不是我想要的。滚动列表时,将创建新项目并将其添加到建议列表中。我希望该机制能够更新标题栏,而不是某些按钮。好吧,我在
itemsbuilder
中触发
appBarTitleNotifier
没有任何问题,因此您需要复制/粘贴您得到的异常,但您也有一些奇怪之处:1<代码>静态最终建议删除
最终建议
,2。为什么ListView没有
项目计数:
?如果这不起作用,我可以在这里发布我的工作示例。另外注意,可能不建议尝试修改(添加到)
itemBuilder
中的列表,如果控制不当,可能会导致一些奇怪的行为