Home > Mobile >  Flutter setState not updating values
Flutter setState not updating values

Time:06-21

Hi there a Flutter newbie here. I have a project to be submitted via flutter. This is my main code and it's not updating text to stop when button was clicked.

import 'package:assets_audio_player/assets_audio_player.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher_string.dart';

import 'firebase_options.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'FM Mahanama',
      theme: ThemeData(
        primaryColor: const Color(0xfffbc02d),
        primarySwatch: Colors.amber,
        useMaterial3: true,
      ),
      darkTheme: ThemeData(
        primaryColor: const Color(0xfffbc02d),
        primarySwatch: Colors.amber,
        brightness: Brightness.dark,
        useMaterial3: true,
      ),
      themeMode: ThemeMode.system,
      debugShowCheckedModeBanner: false,
      home: const MyHomePage(title: 'FM Mahanama'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  int _selectedAppIndex = 0;

  IconData iconPlayStop = Icons.play_arrow_rounded;
  String txtPlayStop = "Play";

  static final assetsAudioPlayer = AssetsAudioPlayer();

  @override
  void initState() {
    WidgetsFlutterBinding.ensureInitialized();
    initFirebaseActivities();
  }

  void initFirebaseActivities() {
    Firebase.initializeApp();
  }

  static Future<void> initRadioPlayer(param0) async {
    try {
      await assetsAudioPlayer.open(
        Audio.liveStream(param0),
        showNotification: true,
        autoStart: true,
      );
    } catch (t) {
      AlertDialog(title: const Text("Error"), content: Text(t.toString()),);
    }
  }

  void updateButtonText(String txt, IconData iconData){
    setState(() {
      txtPlayStop = txt;
      iconPlayStop = iconData;
    });
  }

  @override
  void dispose() {
    if(assetsAudioPlayer.isPlaying.value){
      assetsAudioPlayer.stop();
    }
  }

  static void _openFacebookPage() async {
    String fbProtocolUrl = "fb://page/865683116816630";
    String fallbackUrl = "https://www.facebook.com/mcrcofficial/";
    try {
      bool launched = await launchUrlString(fbProtocolUrl);
      if (!launched) {
        await launchUrlString(fallbackUrl);
      }
    } catch (e) {
      await launchUrlString(fallbackUrl);
    }
  }

  late final Set<Widget> _appPages = <Widget>{
    Center(
      child: StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
        stream: FirebaseFirestore.instance
            .collection("public")
            .doc("stream")
            .snapshots(),
        builder: (BuildContext context,
            AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>> data) {
          if (data.hasData) {
            if (!data.data?.get("onair")) {
              if (assetsAudioPlayer.isPlaying.value) {
                assetsAudioPlayer.stop();
              }
            }

            return Visibility(
              replacement: Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  mainAxisSize: MainAxisSize.max,
                  children: <Widget>[
                    Padding(
                      padding: const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 20.0),
                      child: Image.asset(
                        "assets/images/app_logo.png",
                        width: 200.0,
                        fit: BoxFit.cover,
                      ),
                    ),
                    const Text(
                      "FM Mahanama is currently offline!",
                      style: TextStyle(fontSize: 18.0),
                    ),
                    const Padding(
                      padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 20.0),
                      child: Text(
                          "Checkout our Facebook for page more information"),
                    ),
                    Padding(
                      padding: const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 20.0),
                      child: TextButton.icon(
                        onPressed: () {
                          _openFacebookPage();
                        },
                        icon: const Icon(Icons.link_rounded),
                        label: const Text("Facebook Page"),
                      ),
                    ),
                  ],
                ),
              ),
              visible: data.data?.get("onair"),
              child: Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  mainAxisSize: MainAxisSize.max,
                  children: <Widget>[
                    Padding(
                      padding: const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 30.0),
                      child: Card(
                        shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(30.0)),
                        elevation: 10.0,
                        child: ClipRRect(
                          borderRadius: BorderRadius.circular(30.0),
                          child: Image.network(
                            data.data?.get("cover_img"),
                            width: 300.0,
                            height: 300.0,
                            fit: BoxFit.fitHeight,
                          ),
                        ),
                      ),
                    ),
                    const Padding(
                      padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 5.0),
                      child: Text(
                        "Now Playing",
                        style: TextStyle(fontSize: 22.0),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 20.0),
                      child: Text(
                        data.data!.get("nowplaying").toString(),
                        style: const TextStyle(
                            fontSize: 24.0, fontWeight: FontWeight.w600),
                      ),
                    ),
                    const Padding(
                      padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 5.0),
                      child: Text(
                        "By",
                        style: TextStyle(fontSize: 18.0),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 30.0),
                      child: Text(
                        data.data!.get("by").toString(),
                        style: const TextStyle(
                            fontSize: 22.0, fontWeight: FontWeight.w600),
                      ),
                    ),
                    ElevatedButton.icon(
                      onPressed: () {
                        if(!assetsAudioPlayer.isPlaying.value) {
                          initRadioPlayer(data.data?.get("link"));
                          updateButtonText("Stop", Icons.stop_rounded);
                        }else{
                          assetsAudioPlayer.stop();
                          updateButtonText("Play", Icons.play_arrow_rounded);
                        }
                      },
                      label: Text(getButtonString(), style: const TextStyle(fontSize: 24.0),),
                      icon: Icon(iconPlayStop, size: 24.0,),
                    ),
                  ],
                ),
              ),
            );
          } else {
            return const Text("There is a error loading data!");
          }
        },
      ),
    ),
    const Center(
      child: Text("Scoreboard"),
    ),
    const Center(
      child: Text("About"),
    ),
  };

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Center(
          child: Text(widget.title),
        ),
      ),
      body: Center(
        child: _appPages.elementAt(_selectedAppIndex),
      ),
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        backgroundColor: Colors.transparent,
        elevation: 0,
        currentIndex: _selectedAppIndex,
        selectedFontSize: 14,
        unselectedFontSize: 14,
        showUnselectedLabels: false,
        onTap: (value) {
          setState(() {
            _selectedAppIndex = value;
          });
        },
        items: const [
          BottomNavigationBarItem(
            label: "Player",
            icon: Icon(Icons.music_note_rounded),
          ),
          BottomNavigationBarItem(
            label: "Scoreboard",
            icon: Icon(Icons.scoreboard_rounded),
          ),
          BottomNavigationBarItem(
            label: "About",
            icon: Icon(Icons.info_rounded),
          ),
        ],
      ),
    );
  }

  static String getButtonString() {
    if(assetsAudioPlayer.isPlaying.value){
      return "Stop";
    }else{
      return "Play";
    }
  }
}

What I want is to update the button text and icon stop text and icon to when the button is pressed and the player is playing and vice versa.

I am using the latest build of flutter with material design widgets. I am building for android and ios.

CodePudding user response:

you need to tell your code when did you change the state by doing setState()

ElevatedButton.icon(
                  onPressed: () {
                  setState(() {// add this whenever you want to change the values and update your screen
                    if(!assetsAudioPlayer.isPlaying.value) {
                      initRadioPlayer(data.data?.get("link"));
                      updateButtonText("Stop", Icons.stop_rounded);
                    }else{
                      assetsAudioPlayer.stop();
                      updateButtonText("Play", Icons.play_arrow_rounded);
                    }
                  });
                  },
                  label: Text(getButtonString(), style: const 
                  TextStyle(fontSize: 24.0),),
                  icon: Icon(iconPlayStop, size: 24.0,),
                ),

CodePudding user response:

You can use like that:

   ElevatedButton.icon(
        onPressed: () async {
          await getButtonString();
          setState(() {
          });
        },
        label: Text(getButtonString(), style: const
        TextStyle(fontSize: 24.0),),
        icon: Icon(iconPlayStop, size: 24.0,),
      ),

For more information https://dart.dev/codelabs/async-await

  • Related