0

I am learning flutter and have some experience in javascript. I want to add length of _suggestions to _appBar. I know I need setState(), but I can't find the right place to insert setState(). When I add setState in build(), the flutter framework issues error. I understand the setState requires the build to be called, so if setState() is in build(), the condition is recursive. And the ListView.builder seems to have no event handler. If there is event handler, I can register setState() there.

// Copyright 2018 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:english_words/english_words.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Welcome to Flutter'),
          toolbarHeight: 100.0,
        ),
        body: const Center(
          child: RandomWords(),
        ),
      ),
    );
  }
}
/*
https://stackoverflow.com/questions/60902203/flutter-update-the-text-in-appbar
http://fluttersamples.com/
https://bendyworks.com/blog/a-month-of-flutter-rendering-a-list-view-with-stream-builder

https://stackoverflow.com/questions/48481590/how-to-set-update-state-of-statefulwidget-from-other-statefulwidget-in-flutter
*/
class RandomWords extends StatefulWidget {
  const RandomWords({Key? key}) : super(key: key);

  @override
  State<RandomWords> createState() => _RandomWordsState();
}

class _RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[];
  final _biggerFont = const TextStyle(fontSize: 18.0);
  String title = 'Startup Name Generator';
  final _appBar = const CustomAppBar();
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: _appBar,
      body: ListView.builder(
        padding: const EdgeInsets.all(16.0),
        itemBuilder: (context, i) {
          if(i.isOdd) return const Divider();
          final index = i ~/ 2;
          if(index >= _suggestions.length) {
            _suggestions.addAll(generateWordPairs().take(10));
          }
          return ListTile(
            title: Text(
              _suggestions[index].asPascalCase,
              style: _biggerFont,
            ),
          );
        },
      ),
    );
  }
}

class CustomAppBar extends StatefulWidget implements PreferredSizeWidget {
  const CustomAppBar({Key? key}) : super(key: key);
  @override
  final Size preferredSize = const Size.fromHeight(56); // default is 56.0
  @override
  State<CustomAppBar> createState() => _CustomAppBarState();
}


class _CustomAppBarState extends State<CustomAppBar> {
  String title = "Title";
  _changeTitle(String title) {
    setState(() {
      this.title = title;
    });
  }
  @override
  Widget build(BuildContext context) {
    return AppBar(
      title: Text(title),
    );
  }
}

flutter codelab

Tested this code. but not works.

// Copyright 2018 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:english_words/english_words.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Welcome to Flutter'),
          toolbarHeight: 100.0,
        ),
        body: const Center(
          child: RandomWords(),
        ),
      ),
    );
  }
}
/*
https://stackoverflow.com/questions/60902203/flutter-update-the-text-in-appbar
http://fluttersamples.com/
https://bendyworks.com/blog/a-month-of-flutter-rendering-a-list-view-with-stream-builder

https://stackoverflow.com/questions/48481590/how-to-set-update-state-of-statefulwidget-from-other-statefulwidget-in-flutter
*/
class RandomWords extends StatefulWidget {
  const RandomWords({Key? key}) : super(key: key);

  @override
  State<RandomWords> createState() => _RandomWordsState();
}

class _RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[];
  final _biggerFont = const TextStyle(fontSize: 18.0);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: CustomAppBar(totalSuggestions: _suggestions.length.toString()),
      body: ListView.builder(
        padding: const EdgeInsets.all(16.0),
        itemBuilder: (context, i) {
          if(i.isOdd) return const Divider();
          final index = i ~/ 2;
          if(index >= _suggestions.length) {
            setState(()
            {
              _suggestions.addAll(generateWordPairs().take(10));
            });
          }
          return ListTile(
            title: Text(
              _suggestions[index].asPascalCase,
              style: _biggerFont,
            ),
          );
        },
      ),
    );
  }
}

class CustomAppBar extends StatefulWidget implements PreferredSizeWidget {
  final String totalSuggestions;
  const CustomAppBar({Key? key, required this.totalSuggestions}) : super(key: key);
  @override
  final Size preferredSize = const Size.fromHeight(56); // default is 56.0
  @override
  State<CustomAppBar> createState() => _CustomAppBarState();
}


class _CustomAppBarState extends State<CustomAppBar> {
  @override
  Widget build(BuildContext context) {
    return AppBar(
      title: Row(
        children: [
          Text("Startup Name Generator"),
          Spacer(),
          Text(widget.totalSuggestions),
        ],
      ),
    );
  }
}

enter image description here

EUN WOO LEE
  • 39
  • 1
  • 5

1 Answers1

2
class RandomWords extends StatefulWidget {
  const RandomWords({Key? key}) : super(key: key);

  @override
  State<RandomWords> createState() => _RandomWordsState();
}

class _RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[];
  final _biggerFont = const TextStyle(fontSize: 18.0);
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: CustomAppBar(totalSuggestions: _suggestions.length);,
      body: ListView.builder(
        padding: const EdgeInsets.all(16.0),
        itemBuilder: (context, i) {
          if(i.isOdd) return const Divider();
          final index = i ~/ 2;
          if(index >= _suggestions.length) {
            setState((){
              _suggestions.addAll(generateWordPairs().take(10));
            })
          }
          return ListTile(
            title: Text(
              _suggestions[index].asPascalCase,
              style: _biggerFont,
            ),
          );
        },
      ),
    );
  }
}

class CustomAppBar extends StatefulWidget implements PreferredSizeWidget {
  final String totalSuggestions;
  const CustomAppBar({Key? key, requiered this.totalSuggestions}) : super(key: key);
  @override
  final Size preferredSize = const Size.fromHeight(56); // default is 56.0
  @override
  State<CustomAppBar> createState() => _CustomAppBarState();
}


class _CustomAppBarState extends State<CustomAppBar> {
  @override
  Widget build(BuildContext context) {
    return AppBar(
      title:Row(
        chidren: [
          Text("Startup Name Generator"), 
          Spacer(), 
          Text(widget.totalSuggestions)
        ],
      ),
    );
  }
}

This may help you. Welcome to flutter

Sharath B Naik
  • 1,016
  • 7
  • 14