Обновление заголовка AppBar из виджета тела в Scaffold - PullRequest
0 голосов
/ 26 октября 2019

Я начинаю использовать флаттер и выполняю учебное пособие «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).

Я не нашел решения здесь, поэтому я спрашиваю. Извините, если на этот вопрос уже был дан ответ, но я не смог найти решение.

...