Флаттер изменить параметр виджета с выпадающего меню и FireStore - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь создать простое приложение musi c. Мои URL-адреса хранятся в коллекции FireStore.

Мой вопрос: Как я могу использовать выпадающее меню, чтобы выбрать URL-адрес и передать его виджету?

Я уже реализовал виджет и работает если я использую жестко запрограммированный URL-адрес в PlayerWidget( url: ).

Также работает раскрывающееся меню и получает значения из firestore. Однако я не знаю, как передать его в PlayerWidget( url: ) из выпадающего списка.

enter image description here enter image description here

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ParentProvider(
        value: value,
        callTimeStamp: callTimeStamp,
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  RaisedButton(
                    child: Text('Play'),
                    onPressed: () {
                      if (loadedCount == activeCount) {
                        updatePlayerState("play");
                      } else {
                        print(
                            "Audio not loaded yet");
                        Fluttertoast.showToast(
                            msg: "Please wait untill the audio loads",
                            toastLength: Toast.LENGTH_SHORT,
                            gravity: ToastGravity.CENTER,
                            timeInSecForIos: 1,
                            backgroundColor: Colors.red,
                            textColor: Colors.white,
                            fontSize: 16.0);
                      }
                      // player1.aaa();
                    },
                  ),
                  SizedBox(
                    width: 10.0,
                  ),
                  RaisedButton(
                    child: Text('Pause'),
                    onPressed: () {
                      if (loadedCount == activeCount) {
                        updatePlayerState("pause");
                      } else {
                        print(
                            "Audio not loaded yet");
                        Fluttertoast.showToast(
                            msg: "Please wait untill the audio loads",
                            toastLength: Toast.LENGTH_SHORT,
                            gravity: ToastGravity.CENTER,
                            timeInSecForIos: 1,
                            backgroundColor: Colors.red,
                            textColor: Colors.white,
                            fontSize: 16.0);
                      }
                      // player1.aaa();
                    },
                  ),
                ],
              ),
              PlayerWidget(
                  childAction: updateParent,
                  url:
                  'https://firebasestorage.googleapis.com/v0/b/flutter-temp.appspot.com/o/${selectedUrl}' ),
              SizedBox(
                height: 30.0,
              ),
              // Dropdown menu starts here
              StreamBuilder<QuerySnapshot>(
                stream: Firestore.instance.collection("urls").snapshots(),
                builder: (context, snapshot) {
                  if (!snapshot.hasData)
                    const Text("Loading.....");
                  else {
                    List<DropdownMenuItem> urlItems = [];
                    for (int i = 0; i < snapshot.data.documents.length; i++) {
                      DocumentSnapshot snap = snapshot.data.documents[i];
                      urlItems.add(
                        DropdownMenuItem(
                          child: Text(
                            snap.documentID,
                            style: TextStyle(color: Color(0xff11b719)),
                          ),
                          value: "${snap.documentID}",
                        ),
                      );
                    }
                    return Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        Icon(Icons.playlist_play ),
                        SizedBox(width: 50.0),
                        DropdownButton(
                          items: urlItems,
                          onChanged: (urlValue) {
                            final snackBar = SnackBar(
                              content: Text(
                                'Selected music is $urlValue',
                                style: TextStyle(color: Color(0xff11b719)),
                              ),
                            );
                            Scaffold.of(context).showSnackBar(snackBar);
                            setState(() {
                              selectedUrl = urlValue;
                            });
                          },
                          value: selectedUrl,
                          isExpanded: false,
                          hint: new Text(
                            "Choose music to play",
                            style: TextStyle(color: Color(0xff11b719)),
                          ),
                        )
                      ],
                    );
                  }
                },
              ),
            ],
          ),
        ),
      ),
    );
  }

Ответы [ 2 ]

1 голос
/ 07 января 2020

Изменить аргумент url в PlayerWidget для:

PlayerWidget(
    childAction: updateParent,
    url: selectedUrl ?? 'a default url if nothing is selected'
)

Это загрузит URL, выбранный в раскрывающемся списке, но если ничего не выбрано, загрузит URL по умолчанию. Если вы не хотите загружать URL-адрес по умолчанию, заключите PlayerWidget следующим образом:

selectedUrl == null?
    Container():
    PlayerWidget(
        childAction: updateParent,
        url: selectedUrl
    )
0 голосов
/ 08 января 2020

Просто упрощая использование простого setState, вы можете использовать String, который удерживает выбранный URL в вашем состоянии из StatefulWidget, как указал Адемир. Что-то вроде:

String _selectedUrl = 'someDefaultUrl';

затем, на вашем onChanged с вашей DropboxButton:

onChanged: (urlValue) => setState(() => _selectedUrl = urlValue);

, а затем просто назначьте _selectedUrl вашему игроку так:

PlayerWidget(
    url: _selectedUrl,
 )

Этого должно быть достаточно.

Кроме того, просто убедитесь, что ваш PlayerWidget соответствующим образом обновляет значение в своем состоянии по методу didUpdateWidget.

@override
void didUpdateWidget(PlayerWidget old){
  super.didUpdateWidget(old);
  if(old.url != widget.url){
     // Just update anything you need to update after changing the url
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...