-
Notifications
You must be signed in to change notification settings - Fork 0
Manage State: Child or Parent
wurzelsand edited this page Jul 10, 2022
·
7 revisions

Widget manages its own state:
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: Scaffold(body: ExampleWidget())));
}
class ExampleWidget extends StatelessWidget {
const ExampleWidget({super.key});
@override
Widget build(BuildContext context) {
return const ExampleButton();
}
}
class ExampleButton extends StatefulWidget {
const ExampleButton({super.key});
@override
State<StatefulWidget> createState() {
return _ExampleButtonState();
}
}
class _ExampleButtonState extends State<ExampleButton> {
bool _active = false;
void _handleButtonChange(bool newValue) {
setState(() {
_active = newValue;
});
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () => {_handleButtonChange(!_active)},
child: Text(_active ? 'active' : 'inactive'));
}
}Parent manages state of Widget:
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: Scaffold(body: ExampleWidget())));
}
class ExampleWidget extends StatefulWidget {
const ExampleWidget({super.key});
@override
State<StatefulWidget> createState() {
return _ExampleWidgetState();
}
}
class _ExampleWidgetState extends State<ExampleWidget> {
bool _buttonActive = false;
void _handleButtonChanged(bool newValue) {
setState(() {
_buttonActive = newValue;
});
}
@override
Widget build(BuildContext context) {
return ExampleButton(
active: _buttonActive, onChanged: _handleButtonChanged);
}
}
class ExampleButton extends StatelessWidget {
const ExampleButton(
{super.key, this.active = false, required this.onChanged});
final bool active;
final ValueChanged<bool> onChanged; // #1
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () => {onChanged(!active)},
child: Text(active ? 'active' : 'inactive'));
}
}-
ValueChanged<bool>ist das gleiche wievoid Function(bool).
Parent kontrolliert State eines Teils seines Childs. Einen anderen Teil seines States kontrolliert das Child selbst. Hier wird der Buttontext vergrößert, sobald der Mauszeiger über dem Button schwebt.

import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: Scaffold(body: ExampleWidget())));
}
class ExampleWidget extends StatefulWidget {
const ExampleWidget({super.key});
@override
State<StatefulWidget> createState() {
return _ExampleWidgetState();
}
}
class _ExampleWidgetState extends State<ExampleWidget> {
bool _buttonActive = false;
void _handleButtonChanged(bool newValue) {
setState(() {
_buttonActive = newValue;
});
}
@override
Widget build(BuildContext context) {
return ExampleButton(
active: _buttonActive, onChanged: _handleButtonChanged);
}
}
class ExampleButton extends StatefulWidget {
const ExampleButton(
{super.key, this.active = false, required this.onChanged});
final bool active;
final ValueChanged<bool> onChanged;
@override
State<StatefulWidget> createState() {
return _ExampleButtonState();
}
}
class _ExampleButtonState extends State<ExampleButton> {
bool _hovered = false;
void _handleHoverChanged(bool newValue) {
setState(() {
_hovered = newValue;
});
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () => {widget.onChanged(!widget.active)},
onHover: _handleHoverChanged,
child: Text(
widget.active ? 'active' : 'inactive',
textScaleFactor: _hovered ? 1.5 : 1.0,
));
}
}- Button und Counter
- Mouse Events
- Stack-Widget
- CustomMultiChildLayout, Flow, LayoutBuilder, Flex
- Various Widgets
- Focus with Border
- Keyboard Shortcuts
- Dialog mit Ok und Cancel
- Constraints
- Manage State: Child or Parent
- Assets
- Navigation
- Bloc
- Animations
- Keys
- Create Plugin
- SQLite
- Firebase
- Riverpod
- Signals
- Flame Time Measurement
- Native and Web