Не пытайтесь сохранить состояние того, выбран ли он в самой кнопке.Как вы уже видели, сложно синхронизировать состояние трех кнопок.Найдите место выше дерева виджетов, где вы сможете поддерживать это состояние один раз.В этом случае это в вашем приложении.Сделайте приложение с состоянием, чтобы оно могло помнить состояние, и тогда ваши кнопки не должны помнить его.Им можно сказать, выбран ли (большой) или невыбранный (маленький) в своем конструкторе.
Итак, как кнопка сообщает родителю, что она теперь стала выбранной?Существуют различные стратегии, но все они включают в себя:
- вызов метода, который был передан
- вызов метода InheritedWidget
- отправка сообщения через поток
- и т. Д.
Попробуйте это:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
State createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
int selected = 0;
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.ltr,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
ButtonWidget(0, flexValue(0), 'Hello', Colors.yellow, onClick),
ButtonWidget(1, flexValue(1), 'This is', Colors.red, onClick),
ButtonWidget(2, flexValue(2), 'Button', Colors.blue, onClick),
],
),
);
}
void onClick(int i) {
setState(() {
selected = i;
});
}
int flexValue(int index) => (index == selected) ? 2 : 1;
}
class ButtonWidget extends StatelessWidget {
ButtonWidget(this.index, this._flexValue, this.text, this.selectedColor,
this.notifyClick);
final Function notifyClick;
final int index;
final int _flexValue;
final String text;
final MaterialColor selectedColor;
@override
Widget build(BuildContext context) {
return Expanded(
flex: _flexValue,
child: FlatButton(
color: selectedColor,
child: Text(
text,
),
onPressed: () {
notifyClick(index);
},
),
);
}
}