- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个像这样的JSON:
[
{
"continentName": "NA",
"isDayTime": true,
"seasonName": "Spring",
"cityName": "United States",
"xAlign": 45.4,
"yAlign": 69,
"cityTemperature": 27
},
{
"continentName": "NA",
"isDayTime": true,
"seasonName": "Spring",
"cityName": "Canada",
"xAlign": 35.7,
"yAlign": 53,
"cityTemperature": 16
},
{
"continentName": "NA",
"isDayTime": true,
"seasonName": "Summer",
"cityName": "Mexico",
"xAlign": 87.8,
"yAlign": 41.8,
"cityTemperature": 28
},
{
"continentName": "NA",
"isDayTime": false,
"seasonName": "Summer",
"cityName": "Cuba",
"xAlign": 55.3,
"yAlign": 88.8,
"cityTemperature": 27
},
{
"continentName": "EU",
"isDayTime": true,
"seasonName": "Winter",
"cityName": "Germany",
"xAlign": 33.8,
"yAlign": 38.8,
"cityTemperature": 3
}
]
我想显示过滤的数据,如下所示:
TabBar
(“continentName”)ToggleButtons
(“isDayTime”)=>需要至少一个选择ToggleButtons
(“listSeason”)=>互斥选择,但不允许选择任何按钮。 Tabbar
被选择为“NA”,第一个
toggleButtons
(“isDayTime”)被选择为“Day” =>
我希望如果单击“Spring” =>它将显示令人满意的数据,具体来说就是“美国”和“加拿大”
import 'package:ask/model/temperature_model.dart';
import 'package:ask/services/temperature_service.dart';
import 'package:flutter/material.dart';
class CityTemperature extends StatefulWidget {
CityTemperature() : super();
@override
_CityTemperatureState createState() => _CityTemperatureState();
}
class _CityTemperatureState extends State<CityTemperature> {
List<Temperature> _temperature = [];
List<bool> isDayTime = [true, false];
List<bool> listSeason = [false, false, false, false];
@override
void initState() {
super.initState();
TemperatureServices.getTemperature().then((temperature) {
setState(() {
_temperature = temperature;
});
});
}
@override
Widget build(BuildContext context) {
return Container(
child: DefaultTabController(
length: 4,
child: Scaffold(
appBar: AppBar(
title: Text('Temperature'),
bottom: TabBar(tabs: [
Tab(child: Text('NA')),
Tab(child: Text('EU')),
Tab(child: Text('Africa')),
Tab(child: Text('Asia')),
]),
),
body: Column(children: [
Center(
child: ToggleButtons(
children: [Text('Day'), Text('Night')],
onPressed: (int index) {
setState(() {
for (int buttonIndex = 0; buttonIndex < isDayTime.length; buttonIndex++) {
if (buttonIndex == index) {
isDayTime[buttonIndex] = true;
} else {
isDayTime[buttonIndex] = false;
}
}
});
},
isSelected: isDayTime)),
SizedBox(height: 5),
Center(
child: ToggleButtons(
children: [Text('Spring'), Text('Summer'), Text('Autumn'), Text('Winter')],
onPressed: (int index) {
setState(() {
for (int buttonIndex = 0; buttonIndex < listSeason.length; buttonIndex++) {
if (buttonIndex == index) {
listSeason[buttonIndex] = !listSeason[buttonIndex];
} else {
listSeason[buttonIndex] = false;
}
}
});
},
isSelected: listSeason)),
SizedBox(height: 5),
Expanded(
child: TabBarView(children: [
Column(children: [ // How to display the satisfying data
for (Temperature temp in _temperature)
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(temp.cityName),
Text('${temp.cityTemperature.toString()}° C'),
],
)
]),
Column(), // How to display the satisfying data
Column(), // How to display the satisfying data
Column(), // How to display the satisfying data
]),
)
]))));
}
}
TabBarView
和每个_tabs
添加背景图像isDayTime
continentName
,白天或黑夜都有2张图像。 Assets
中,以使用户更快地加载。此外,为避免在json =>上创建更多数据,我将图像的文件名创建为:“na_day.png”或“na_true.png”,并通过Image.asset('assets/${temp.continentName}_${isDayTime}.png')
或类似的cityName
xAlign
和yAlign
来确定cityName
在图像上的位置(已更新JSON)IntrinsicHeight
,Stack
和Align
这样做:class DisplayCountry extends StatelessWidget {
final List<Temperature> countries;
DisplayCountry({this.countries});
@override
Widget build(BuildContext context) {
return Column(children: [
for (Temperature temp in countries) // I don't know where to put this
IntrinsicHeight(
child: Stack(children: [
Image.asset('assets/${temp.continentName}_${isDayTime}.png'.asset), // Or something like this
Align(
alignment: Alignment(temp.xAlign / 100 * 2 - 1, temp.yAlign / 100 * 2 - 1),
child: Text(temp.cityName),
),
]),
)
]);
}
}
extension AssetsExtension on String {
String get asset => this.toLowerCase().replaceAll(" ", "_").replaceAll("'", "_");
}
因此,请帮助我更新
class DisplayCountry
以便能够结合上述两件事
最佳答案
像这样的东西
class CityTemperature extends StatefulWidget {
CityTemperature() : super();
@override
_CityTemperatureState createState() => _CityTemperatureState();
}
class _CityTemperatureState extends State<CityTemperature> {
List<Temperature> _temperature = [];
List<String> _tabs = [];
Map<String, bool> isDayTime = {'Day': true, 'Night': false};
Map<String, bool> listSeason = {'Spring': false, 'Summer': false, 'Autumn': false, 'Winter': true};
@override
void initState() {
super.initState();
var response = json.decode(jsonFile);
_temperature = List<Temperature>.from(response.map((x) => Temperature.fromJson(x)));
_tabs = _temperature.map<String>((x) => x.continentName).toSet().toList();
/*
TemperatureServices.getTemperature().then((temperature) {
setState(() {
_temperature = temperature;
});
});*/
}
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: _tabs.length,
child: Scaffold(
appBar: AppBar(
title: Text('Temperature'),
bottom: TabBar(
tabs: _tabs.map((String name) => Tab(text: name)).toList()
),
),
body: Column(children: [
Center(
child: ToggleButtons(
children: isDayTime.keys.map((key) => Text(key)).toList(),
onPressed: (int index) {
String indexKey = isDayTime.keys.toList()[index];
setState(() {
isDayTime.updateAll(
(key, value) => key == indexKey ? true : false);
}
);
},
isSelected: isDayTime.values.toList())),
SizedBox(height: 5),
Center(
child: ToggleButtons(
children: listSeason.keys.map((key) => Text(key)).toList(),
onPressed: (int index) {
String indexKey = listSeason.keys.toList()[index];
setState(() {
listSeason.updateAll(
(key, value) => key == indexKey ?
!listSeason[indexKey] : false);
});
},
isSelected: listSeason.values.toList())),
SizedBox(height: 5),
Expanded(
child: TabBarView(
children: _tabs.map((String name) {
return DisplayCountry(
countries: List<Temperature>.from(_temperature)
..retainWhere((temperature) =>
temperature.continentName == name
&& temperature.isDayTime == isDayTime['Day']
&& temperature.seasonName == listSeason.keys.firstWhere(
(k) => listSeason[k] == true, orElse: () => 'Nothing'))
);
}).toList()
),
)
]
)
)
);
}
}
class DisplayCountry extends StatelessWidget{
final List<Temperature> countries;
DisplayCountry({this.countries});
@override
Widget build(BuildContext context){
return Column(
children: [
for(Temperature temp in countries)
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(temp.cityName),
Text('${temp.cityTemperature.toString()}° C'),
],
)
]
);
}
}
我创建了一个名为_tabs的列表,其中所有大陆名称均为_temperatures,然后将其添加到set和toList中。 toSet将其转换为一个集合,一个集合是一个不允许重复值的可迭代的集合,然后我将其转换回列表,这样我就有了一个唯一的continentName(NA,EU等)列表。
class DisplayImage extends StatelessWidget {
final List<Temperature> countries;
final String continentName;
final bool isDayTime;
DisplayImage({this.countries , this.continentName, this.isDayTime});
@override
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
return Stack(
fit: StackFit.passthrough,
children: [
Image.asset('assets/$continentName_$isDayTime.png'.asset),
fit: BoxFit.cover,),
for (Temperature temp in countries)
Positioned(
left: temp.xAlign * size.width / 100.0,
top: temp.yAlign / 2 * size.height / 100.0,
child: Text('${temp.cityName} ${temp.cityTemperature.toString()}° C'),
)
]);
}
}
以及在TabView中调用它时
TabBarView(
children: _tabs.map((String name) {
return DisplayImage(
continentName: name,
isDayTime: isDayTime['Day'],
countries: List<Temperature>.from(_temperature)
..retainWhere((temperature) =>
temperature.continentName == name &&
temperature.isDayTime == isDayTime['Day'] &&
temperature.seasonName ==
listSeason.keys.firstWhere(
(k) => listSeason[k] == true,
orElse: () => 'Nothing')));
}).toList())
据我了解,您可以使用堆栈的fit属性(StackFit.passthrough),它的工作方式与InternalHeight相同。从文档中
StackFit.passthrough
For example, if a Stack is an Expanded child of a Row, the horizontal constraints will be tight and the vertical constraints will be loose.
在这种情况下,您将在列中使用“扩展”,因此它具有水平的松散和垂直的紧密性。然后做一些数学运算,如果定位不符合您的要求,请尝试“对齐”小部件
关于flutter - Flutter:如何基于TabBar和ToggleButtons从JSON过滤数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62540501/
我正在尝试自定义我的 ToggleButtons,以便在选中时以绿色表示"is",在未选中时以红色表示“否”。 我创建了以下样式,它位于我的样式资源字典中。
我是 Android 开发的新手,所以如果这是一个“菜鸟”问题,我提前表示歉意。 使用 RelativeLayout,我有一个 ID 为 reminderToggle 的 ToggleButton:
我想为 ToggleButton 创建一个动画“切换”样式(就像在智能手机上一样)。 动画本身不是问题,当我点击它时,开关看起来不错并且动画。但它也会在加载并打开时进行动画处理。 当我加载我的 Vie
我有这段代码可以以编程方式按下按钮,但我想要一个适用于 ToggleButton 的版本。 public static void PushButton(Button b) { ButtonA
我为 ToggleButton 创建了一个 ContentTemplate 和 Style,它看起来就像你从 Microsoft 的 WebMatrix 中知道的那样。 但是,并非总是可以单击,也不会
我创建了一个从 ToggleButton 扩展的自定义切换按钮。 问题是它不尊重给定的 ToggleGroup。我可以选择多个。但如果您设置默认类 ToogleButton,它只允许我一次选择一个。
我正在为一个小游戏制作一个计算器,一切正常,直到我添加了一个切换按钮。该应用程序在启动时崩溃,但我找不到任何错误。 JAVA代码: . . . int colorOff = getRes
我希望我的 ToggleButton 在检查一段时间后不被选中。我正在使用 Timer 和 TimerTask,但当我尝试执行此操作时,我的应用程序总是强制关闭。这是代码: public class
这是怎么回事,如何解决? 按下 MyToggleButton。现在看起来像是立即按下(选中)。 同时 MyToggleButton_Checked 处理程序禁用 MyToggleButton。 现在按
切换按钮上的正常背景颜色和边框颜色是什么?示例: i.toggle11.setOnAction(e->{ if(i.toggle11.isSelected()){
ToggleButton 的背景突出其底部边框。 谁能告诉我我做错了什么? 我在 SceneBuilder 中为 ToggleButton 设置了 id。 CSS: #blue-unselected
我想在 JavaFX 中创建一个切换按钮,它将执行一个循环,并且仅当用户再次单击该按钮时才会停止;在 Activity 期间,循环将不断更改 TextField 中的文本... 这是 ToggleBu
触摸 ToggleButton 时,它的背景颜色没有改变。切换确实发生了,触摸时不断变化的文本证实了这一点。但颜色始终保持白色,即未选中状态。我做错了什么? 切换按钮: 它的背景是可绘制的 togg
我使用 3 个 ToggleButtons(A、B、C)来过滤数组的内容(使用 AND 条件)并在 ListView 中显示结果。 例如如果 A 为真而 B、C 为假... ListView 将只显示
我想将 7 个切换按钮组织成金字塔形,如下所示: ---b--- --b-b-- -b---b- b-----b 其中 b 代表切换按钮,- 代表空格。我也 wnat 整个金字塔来填充它的 paren
我有一个 CustomButton 类(扩展 LinearLayout),我在其中膨胀一个包含 ToggleButton 的布局(实际上这更复杂,但我在这里简化了问题)。 public class C
是的,我可以用 2 张图片创建 ToggleButton(打开,关闭)但是我想创建一个有 3-5 张图片的 ToggleButton。 例如,它什么时候关闭,我点击: 关闭图片 中图 在图片上 它什么
我是安卓新手。我正在创建一个使用切换按钮的应用程序。我希望切换按钮在按钮处于选中状态时执行一些任务,并在按钮未选中时执行其他任务。而且我希望切换按钮即使在用户关闭应用程序(通过按下后退开关)并返回时也
我有一个这样构造的切换按钮: self.bouton = gtk.ToggleButton() self.bouton.connect("clicked", self.fonct) 在我的程序中,我正
这是我的代码 private void buttonClickone(object sender, RoutedEventArgs e) { if (WhichV == -1) {
我是一名优秀的程序员,十分优秀!