Flutter SnackBar不是';t显示
我开发了一个选择和搜索项目的例程。一切正常,但SnakBar未显示。我不知道为什么。有人能帮我吗 这是SnackBar的代码:Flutter SnackBar不是';t显示,flutter,snackbar,Flutter,Snackbar,我开发了一个选择和搜索项目的例程。一切正常,但SnakBar未显示。我不知道为什么。有人能帮我吗 这是SnackBar的代码: floatingActionButton: FloatingActionButton( onPressed: () async { if (response["result"] == "ok") { final snackBar = SnackBar( content:
floatingActionButton: FloatingActionButton(
onPressed: () async {
if (response["result"] == "ok") {
final snackBar = SnackBar(
content: Text("Músicas adicionadas com sucesso"),
duration: Duration(seconds: 2),
action: SnackBarAction(
label: 'Undo',
onPressed: () {
// Some code to undo the change.
},
),
);
},
tooltip: 'Salvar Músicas',
child: Icon(
Icons.check,
),
backgroundColor: Colors.orange,
),
这是完整的代码:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:mysongs_v2/global.dart';
import 'package:mysongs_v2/models/playlistsong.dart';
import 'package:mysongs_v2/models/song.dart';
class SelectSongScreen extends StatefulWidget {
final int playlistId;
final String playlistName;
//constructor
SelectSongScreen({this.playlistId, this.playlistName}) : super();
@override
State<StatefulWidget> createState() {
return _SelectSongScreenState();
}
}
class _SelectSongScreenState extends State<SelectSongScreen> {
TextEditingController searchController = new TextEditingController();
int userId = 1;
var selectedSong = new Song();
var songsSelected = new List<String>();
var songsSelectedId = new List<String>();
bool _isSelected = true;
bool processing = false;
bool isLoaded = false;
onSearchTextChanged(String text) async {
isLoaded = false;
if (text.isEmpty) {
setState(() {});
return;
}
setState(() {});
}
Container _searchBar() {
var _result = new Container(
color: COLOR_MAIN,
child: new Padding(
padding:
const EdgeInsets.only(top: 1.0, bottom: 1.0, left: 2.0, right: 2.0),
child: new Card(
child: new ListTile(
leading: new Icon(Icons.search),
title: new TextField(
controller: searchController,
decoration: new InputDecoration(
hintText: 'Search', border: InputBorder.none),
onChanged: onSearchTextChanged,
),
trailing: new IconButton(
icon: new Icon(Icons.cancel),
onPressed: () {
searchController.clear();
onSearchTextChanged('');
},
),
),
),
),
);
return _result;
}
List<Container> _buildListItemsFromSongs(List<Song> songs) {
int index = 0;
return songs.map((song) {
_isSelected = false;
for (int i = 0; i <= this.songsSelected.length - 1; i++) {
if (songsSelected[i] == song.name) {
_isSelected = true;
}
}
var _container = Container(
child: Column(
children: <Widget>[
ListTile(
selected: true,
enabled: true,
leading: _isSelected
? Icon(
Icons.check,
size: 40,
color:
(_isSelected ? Colors.green[700] : Colors.green[500]),
)
: Icon(
Icons.add_circle,
size: 40,
color:
(_isSelected ? Colors.green[700] : Colors.green[500]),
),
title: Text(song.name,
style: TextStyle(
color: Colors.black, fontWeight: FontWeight.bold)),
subtitle:
Text(song.singer, style: TextStyle(color: Colors.black)),
onTap: () {
isLoaded = true;
print("You tapped to TILE ${song.name}");
setState(() {
selectedSong = song;
var _pos = this.songsSelected.indexOf(song.name);
if (_pos == -1) {
this.songsSelected.add(song.name);
} else {
this.songsSelected.removeAt(_pos);
}
//processing = true;
});
},
),
new Divider(
height: 20.0,
)
],
),
);
index = index + 1;
return _container;
}).toList();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(
Icons.arrow_back,
),
onPressed: () {
Navigator.of(context).pop();
Navigator.of(context).pop();
},
),
backgroundColor: COLOR_MAIN,
title: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Adicionar Músicas ao playist"),
Text(
widget.playlistName,
style: TextStyle(fontSize: 16.0),
)
],
),
),
body: new FutureBuilder(
future: searchSongsCheckPlaylist(http.Client(), widget.playlistId,
searchController.text, isLoaded),
builder: (BuildContext context, AsyncSnapshot<List> snapshot) {
if (!snapshot.hasData) return new Container();
List<Song> songs = new List();
songs = snapshot.data;
if (songs.length == 0 || songs[0].name.isEmpty) {
return new Column(
children: <Widget>[
_searchBar(),
new Expanded(
child: new ListView(
children: <Widget>[
Container(
//color: Colors.grey[500],
child: new Padding(
padding: const EdgeInsets.all(8.0),
child: new Container(
child: new Icon(
Icons.search,
color: Colors.grey[500],
size: 260.0,
//semanticLabel: 'Text to announce in accessibility modes',
),
),
),
),
Container(
child: new Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
new Text(
'Você pode pesquisar por nome da MÚSICA',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20.0,
color: Colors.grey[500]),
),
new Text(
'ou por nome do ARTISTA',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20.0,
color: Colors.grey[500]),
),
],
),
),
),
],
),
),
],
);
} else {
return new Column(
children: <Widget>[
_searchBar(),
//Container(child: Icon(Icons.add),),
new Expanded(
child: ListView(
children: _buildListItemsFromSongs(songs),
),
),
],
);
}
}),
floatingActionButton: FloatingActionButton(
onPressed: () async {
if (response["result"] == "ok") {
final snackBar = SnackBar(
content: Text("Músicas adicionadas com sucesso"),
duration: Duration(seconds: 2),
action: SnackBarAction(
label: 'Undo',
onPressed: () {
// Some code to undo the change.
},
),
);
},
tooltip: 'Salvar Músicas',
child: Icon(
Icons.check,
),
backgroundColor: Colors.orange,
),
);
}
}
导入“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“包:mysongs_v2/global.dart”;
导入“package:mysongs_v2/models/playlishong.dart”;
导入“package:mysongs_v2/models/song.dart”;
类SelectSongScreen扩展StatefulWidget{
最终int播放ID;
最终字符串名称;
//建造师
选择SongScreen({this.playlid,this.playlname}):super();
@凌驾
状态createState(){
返回_SelectSongScreenState();
}
}
类_SelectSongScreenState扩展状态{
TextEditingController searchController=新的TextEditingController();
int userId=1;
var selectedSong=新歌曲();
var songsSelected=新列表();
var songsSelectedId=新列表();
bool_isSelected=true;
布尔处理=假;
bool isLoaded=false;
onSearchTextChanged(字符串文本)异步{
isLoaded=false;
if(text.isEmpty){
setState((){});
返回;
}
setState((){});
}
容器搜索栏(){
var_result=新容器(
颜色:主色,
孩子:新的填充物(
衬垫:
仅限常数边集(顶部:1.0,底部:1.0,左侧:2.0,右侧:2.0),
孩子:新卡(
孩子:新的ListTile(
前导:新图标(Icons.search),
标题:新文本字段(
控制器:搜索控制器,
装饰:新的输入装饰(
hintText:“搜索”,边框:InputBorder.none),
onChanged:onSearchTextChanged,
),
拖尾:新图标按钮(
图标:新图标(图标。取消),
已按下:(){
searchController.clear();
onSearchTextChanged(“”);
},
),
),
),
),
);
返回结果;
}
列表_buildListItemsFromSongs(列表歌曲){
int指数=0;
返回歌曲。映射((歌曲){
_isSelected=false;
对于onPressed中的(inti=0;i),您只需声明snackbar,但还需要调用showSnackBar(yourSnackBar),这是scaffoldState中的一个方法
因此,您可以说Scaffold.of(context).showSnackBar(yourSnackBar)在onPressed中,您只需声明snackbar,但还需要调用showSnackBar(yourSnackBar),这是scaffoldState上的一个方法
所以你可以说Scaffold.of(context).showSnackBar(你的snackbar)你必须从Scaffold中获取snackbar
Scaffold.of(context).showSnackBar(
SnackBar(
content: Text('Snackbar'),
),
);
你必须从断头台上取下弹簧条
Scaffold.of(context).showSnackBar(
SnackBar(
content: Text('Snackbar'),
),
);
在代码中,您只需将SnackBar()
小部件设置为一个变量,并且从不在任何地方使用它。这不会显示它
解决方案是从ScaffoldMessenger
小部件将SnackBar()
传递到showSnackBar()
方法
示例:
ScaffoldMessenger.of(context).showSnackBar(mySnackBar);
要从视图中隐藏或删除它,请调用removeCurrentSnackBar()
方法,如下所示:
ScaffoldMessenger.of(context).removeCurrentSnackBar();
不推荐的注释:
对于2021年,在颤振v1.23.0-14.0.pre之后,不推荐使用(上下文)的脚手架
这是我对一个相关问题的回答。在您的代码中,您只需将SnackBar()
小部件设置为变量,并且从不在任何地方使用它。这不会显示它
解决方案是从ScaffoldMessenger
小部件将SnackBar()
传递到showSnackBar()
方法
示例:
ScaffoldMessenger.of(context).showSnackBar(mySnackBar);
要从视图中隐藏或删除它,请调用removeCurrentSnackBar()
方法,如下所示:
ScaffoldMessenger.of(context).removeCurrentSnackBar();
不推荐的注释:
对于2021年,在颤振v1.23.0-14.0.pre之后,不推荐使用(上下文)的脚手架
这是我对一个相关问题的回答