Могу ли я обновить родительское состояние из диалогового окна в Flutter?

#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 не потерять новый набор значений.