Я начинаю использовать флаттер и выполняю учебное пособие «Startup Name Generator», также изменяю код, чтобы делать некоторые другие вещи, и столкнулся с проблемой, которую я не могу решить. Я хочу, чтобы заголовок AppBar показывал размер массива _suggestions, но не могу заставить его работать, пробовал много разных вещей, но безрезультатно, всегда получая исключение при попытке использовать setState (), когда уже вbuild.
Это то, что у меня сейчас есть:
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();
}
Я использовал ValueNotifier и слушатель после некоторых исследований событий, но то же исключение, что и при ручном использовании setState ()вызов в ListView itemBuilder (где проблема, кажется, лежит; вызов / обновление заголовка AppBar из ListView itemBuilder).
Я не нашел решения здесь, поэтому я спрашиваю. Извините, если на этот вопрос уже был дан ответ, но я не смог найти решение.