#flutter #dart
Вопрос:
Я пытаюсь создать диалоговое окно настроек, которое содержит пользовательские параметры для темы, шрифта и т. Д. У меня есть выбор в диалоговом окне, работающий отзывчиво, но setState()
не обновляющий состояние родителя из диалогового окна (несмотря на то, что я назвал функцию определения состояния для своего StatefulBuilder «updateDialogState»).
Как я могу это решить?
Минимальный пример:
class WritingScreenState extends Statelt;WritingScreengt; { late Listlt;Sectiongt; sections; @override void initState() { super.initState(); sections = [] } @override Widget build(BuildContext context) { WrittenTextTheme currentTheme = WrittenTextTheme.light; return Scaffold( appBar: AppBar( actions: [ IconButton( icon: Icon(Icons.tune), tooltip: "Preferences", onPressed: () { showDialog(context: context, builder: (context) { return AlertDialog( title: Text("Preferences"), content: StatefulBuilder( builder: (context, StateSetter updateDialogState) { return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("Theme"), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Flexible( flex: 1, child: InkWell( onTap: () { updateDialogState(() { currentTheme = WrittenTextTheme.light; }); setState(() { currentTheme = WrittenTextTheme.light; }); }, child: Container( height: 50, decoration: BoxDecoration( color: Colors.white, border: currentTheme == WrittenTextTheme.light ? Border.all(color: Theme.of(context).primaryColor, width: 3) : Border.all(), borderRadius: BorderRadius.circular(6) ), child: Align( alignment: Alignment.center, child: Text( "Aa", style: TextStyle( fontSize: 28, color: Colors.grey[800], ) ), ), ), ), ), Flexible( flex: 1, child: InkWell( onTap: () { updateDialogState(() { currentTheme = WrittenTextTheme.dark; }); setState(() { currentTheme = WrittenTextTheme.dark; }); }, child: Container( height: 50, decoration: BoxDecoration( color: Colors.blueGrey[800], border: currentTheme == WrittenTextTheme.dark ? Border.all(color: Theme.of(context).primaryColor, width: 3) : Border.all(), borderRadius: BorderRadius.circular(6) ), child: Align( alignment: Alignment.center, child: Text( "Aa", style: TextStyle( fontSize: 28, color: Colors.grey[100], ) ), ), ), ), ), ] ), ], ); } ), actions: [ ElevatedButton( child: Text("SAVE"), onPressed: () { //TODO: save changes Navigator.pop(context); }, ) ], ); }); } ), ], ), ); } }
Ответ №1:
setState
действительно работает. Проблема заключается в том, что код в методе сборки снова будет инициализирован при вызове setState.
@override Widget build(BuildContext context) { WrittenTextTheme currentTheme = WrittenTextTheme.light;
Обновите логику приложения, чтобы setState
не потерять новый набор значений.