Exception 从Scaffold中的body小部件更新AppBar标题
我开始使用flatter并学习“Startup Name Generator”教程,还修改了代码来做一些不同的事情,遇到了一个我无法解决的问题。我希望AppBar标题显示_suggestions数组的大小,但无法使其正常工作,我尝试了许多不同的方法,但都无济于事,总是遇到一个例外,即在构建过程中尝试使用“setState()” 这就是我目前拥有的: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
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
中的列表,如果控制不当,可能会导致一些奇怪的行为