Souvent, vous souhaitez non seulement naviguer vers un nouvel écran, mais aussi transmettre des données à cet écran. Par exemple, vous pouvez vouloir transmettre des informations sur l'élément qui a été touché.
Dans cet exemple, créez une liste de tâches à accomplir. Lorsque l'on touche à un todo, on accède à un nouvel écran (widget) qui affiche des informations sur l'enregistrement. Cette recette utilise les étapes suivantes :
- Définir une classe RecordObject.
- Créer un
StatefulWidget
. Nous l'appelons RecordsScreen (pour : afficher une liste d'enregistrements).
- Créez un écran de détail qui peut afficher des informations sur un enregistrement.
- Naviguez et transmettez les données à l'écran de détail.
Définir une classe RecordObject
class RecordsScreen extends StatefulWidget {
List<RecordObject> records;
RecordsScreen({Key key, @required this.records}) : super(key: key);
@override
_RecordsScreenState createState() => _RecordsScreenState();
}
class _RecordsScreenState extends State<RecordsScreen> {
@override
Widget build(BuildContext context) {
widget.records = List<RecordObject>.generate(20,
(i) => RecordObject(
'Record $i',
'A description of what needs to be done for Record $i',
),
);
return Scaffold(
appBar: AppBar(
title: Text('Records'),
),
body: ListView.builder(
itemCount: widget.records.length,
itemBuilder: (context, index) {
return ListTile(
title: Text( widget.records[index].title),
// When a user taps the ListTile, navigate to the DetailScreen.
// Notice that you're not only creating a DetailScreen, you're
// also passing the current todo through to it.
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailScreen(recordObject: widget.records[index]),
),
);
},
);
},
),
);
}
Créer un écran de détail - Le titre de l'écran contient le titre de l'enregistrement, et le corps de l'écran affiche la description.
class DetailScreen extends StatefulWidget {
// Declare a field that holds the RecordObject.
final RecordObject recordObject;
// In the constructor, require a RecordObject.
DetailScreen({Key key, @required this.recordObject}) : super(key: key);
@override
_DetailScreenState createState() => _DetailScreenState();
}
class _DetailScreenState extends State<DetailScreen> {
@override
Widget build(BuildContext context) {
// Use the RecordObject to create the UI.
return Scaffold(
appBar: AppBar(
title: Text(widget.recordObject.title),
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Text(widget.recordObject.description),
),
);
}
}
2 votes
Duplicata possible de Transmettre des données à un widget dynamique
0 votes
comment utiliser la valeur de la variable 'recordObject' dans une fonction de la classe _RecordPageState ?
1 votes
Cela répond-il à votre question ? Transférer les données du StatefulWidget à la classe State sans utiliser le constructeur.