в основном я обновляю значение списка, которое используется в gridview, когда я нажимаю на карту gridview, я меняю цвет этой карты. когда я печатаю значение цвета, оно менялось, но в gridview не влияет. Пожалуйста, подскажите, что делать? мой логический подход неверен?
class FilterDialog extends ModalRoute<void> {
List<Grades> mGradeList = [];
List<Styles> mStyleList = [];
List<Types> mTypeList = [];
List<Specials> mSpecialList = [];
FilterDialog(this.mGradeList, this.mStyleList, this.mTypeList, this.mSpecialList);
@override
Widget buildPage(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
// This makes sure that text and other content follows the material style
return Material(
type: MaterialType.transparency,
// make sure that the overlay content is not cut off
child: SafeArea(
child: _buildOverlayContent(context),
),
);
}
Widget _buildOverlayContent(BuildContext context) {
return new Container(
padding: EdgeInsets.only(left: 15, right: 15),
child: Column(
children: <Widget>[
titleWidget("Grade"),
gridViewWidget(mGradeList, 3, 2.2),
spaceWidget(),
titleWidget("Style"),
gridViewWidget(mStyleList, 2, 3.5),
spaceWidget(),
titleWidget("Type"),
gridViewWidget(mTypeList, 2, 3.5),
spaceWidget(),
titleWidget("Special"),
gridViewWidget(mSpecialList, 2, 3.5),
],
)
);
}
Widget gridViewWidget(list, int count, double ratio) {
return GridView.count(
shrinkWrap: true,
crossAxisCount: count,
mainAxisSpacing: 2.0,
crossAxisSpacing: 1.0,
childAspectRatio: ratio,
physics: new NeverScrollableScrollPhysics(),
children: _getTiles(list)
);
}
void _onTileClicked(int index, value, list){
assert(index != null);
assert(value != null);
setState(() {
list[index].setSelected(!value);
});
debugPrint("You tapped on item $index with $value");
}
// Get grid tiles
List<Widget> _getTiles(list) {
final List<Widget> tiles = <Widget>[];
for (int i = 0; i < list.length; i++) {
tiles.add(new GridTile(
child: new Center(
child: Container(
height: 35.0,
child: new RaisedButton(
onPressed: () => _onTileClicked(i, list[i]["selected"], list),
color: list[i]["selected"] ? backgroundColor : white, //here value not changing
shape: new RoundedRectangleBorder(
borderRadius:
new BorderRadius.circular(30.0)),
child: new Text(
list[i]["label"],
textAlign: TextAlign.center,
style: new TextStyle(
fontSize: 14.0,
color: Colors.grey,
),
),
),
),
),
));
}
return tiles;
}
модель класса:
class Grades {
String label;
bool selected;
Grades(this.label, this.selected);
void setSelected(bool val) {
this.selected = val;
}
}
некоторые данные:
var typeList = [{"label": "Crack", "selected": false}, {"label": "Face", "selected": false},
{"label": "Slab", "selected": false}, {"label": "Multi-pitch", "selected": false} ];
@ RémiRousselet, я понял, но есть ли способ использовать ModalRoute? bcz необходимо сделать просмотр фильтра в прозрачном полноэкранном диалоге.
_buildOverlayContent
следует передать конструктору, а не быть методом
Widget _buildOverlayContent(BuildContext context) {
gridViewWidget(mTypeList, 2, 3.5)
List<Widget> _getTiles(list) {
onPressed: () => _onTileClicked(i, list[i]["selected"], list),
final typeList = [{"label": "Crack", "selected": false}, {"label": "Face", "selected": false},
{"label": "Slab", "selected": false}, {"label": "Multi-pitch", "selected": false}
Вы намереваетесь использовать typeList как глобальное состояние? Я думаю, что у переменной не должно быть последнего модификатора.
https://www.dartlang.org/guides/language/language-tour
If you never intend to change a variable, use final or const, either instead of var or in addition to a type. A final variable can be set only once; a const variable is a compile-time constant. (Const variables are implicitly final.) A final top-level or class variable is initialized the first time it’s used.
Я основываю свой ответ на том факте, что вы обращаетесь к list[i]["selected"]
как к карте, а вы определяете Grades
как объект.
Спасибо .. буду иметь в виду .. но это не помогает с моим вопросом.
Ответом могло быть два варианта. Думаю, выбор неправильный. Другая проблема - виджет с отслеживанием состояния. Ну что ж. 50/50 шанс
Ваш класс должен расширить StatefulWidget вместе с виджетом Состояние, чтобы вы могли использовать метод setState (). Например:
class FilterWidget extends StatefulWidget {
@override
_FilterWidgetState createState() => _FilterWidgetState();
}
class _FilterWidgetState extends State<FilterWidget> {
//lists here
@override
Widget build(BuildContext context) {
//build stuff here with setState() being used
}
}
Вы можете найти дополнительную информацию здесь из официальных документов.
setState работает нормально .. Я не могу использовать Stateful Widget, потому что это модальный класс диалога, и я получаю обновленное значение каждый раз, это просто не влияет на gridview
Логика в setState изменит значения, но точка setState - уведомить фреймворк об изменении внутреннего состояния этого объекта.. Поскольку ваш виджет не поддерживает состояние или не расширяет состояние, метод setState () не будет работать. Могу я спросить, зачем вы расширяете класс ModalRoute?
потому что filterview должен быть в прозрачном диалоге. вот почему я использую класс ModalRoute. есть ли другой способ сделать диалог прозрачным с помощью виджета с отслеживанием состояния.
Вы можете использовать Цвета. Черный. С прозрачностью (0,8) (с любым желаемым значением) или Цвета. Прозрачный для цветовой опоры виджета Scaffold или Material, чтобы получить эффект прозрачности / стекла. Может быть, попробовать?
он работает с StatefulWidget, но не работает с ModalRoute. Спасибо, что открыли мне глаза. Теперь осталась только проблема - сделать страницу прозрачной ... Я думаю, это невозможно без ModalRoute.
Сохраните его как StatefulWidget, а затем используйте как опору конструктора для метода showDialog. Если в вашем диалоговом окне в качестве основного виджета используется виджет «Материал» или «Скаффолд», вы можете использовать свойства цвета, о которых я упоминал ранее, для изменения прозрачности фона диалогового окна.
Это не работает .. Я пытался установить фон для Scaffold, но он не работал .. Если вы найдете какое-либо решение, пожалуйста, упомяните здесь ..
Встречаюсь с той же проблемой. Мое решение - восстановить объект, который вы хотите изменить, в GridView. Не обновляйте элемент в списке, а восстановите список и обновите элемент по своему усмотрению. Может, это сработает.
Я предполагаю, что если точка списка не будет изменена, GridView, который ее включает, не будет изменен.
Вы не должны создавать свой пользовательский интерфейс в
ModalRoute
. Вы должны переместить это в виджет