J'ai essayé d'exécuter ce code dans Dart. quand je clique sur n'importe quel RaisedButton
, cela ne passe pas à la question suivante. Il montre la sortie suivante dans la console VSCode.
I / flutter (7433): Réponse 2
Je serai très heureux si vous êtes en mesure de me guider à ce sujet. Ci-dessous le code pour fléchettes.
import 'package:flutter/material.dart'; //void main() { //runApp(MyApp()); //} void main() => runApp(MyApp()); class MyApp extends StatefulWidget { @override State<StatefulWidget> createState() { // TODO: implement createState return MyAppState(); }} class MyAppState extends State<MyApp> { var questionIndex = 0; void answerQuestion() { setState(() { questionIndex = questionIndex + 1; }); print(questionIndex); } @override Widget build(BuildContext context) { var questions = [ 'What\'s your favorite color?', 'What\'s your favorite animal?', ]; return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('My First App'), ), body: Column( children: [ Text (questions[questionIndex]), RaisedButton( child: Text('Answer 1'), onPressed: () => print('Answer 1'), ), RaisedButton( child: Text('Answer 2'), onPressed: () => print('Answer 2'), ), RaisedButton( child: Text('Answer 3'), onPressed: () => print('Answer 3'), ), ], )), ); } }
3 Réponses :
ajoutez votre answerQuestion
fonction dans onPress
:
onPressed: () { print('Answer 1'); answerQuestion(); }
La prochaine étape est peut-être de considérer ce que si l'indice est> = 2.
Utilisez le code suivant:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatefulWidget { @override State<StatefulWidget> createState() { return MyAppState(); } } class MyAppState extends State<MyApp> { var questionIndex = 0; var questions = [ 'What\'s your favorite color?', 'What\'s your favorite animal?', ]; void answerQuestion() { setState(() { if (questionIndex < questions.length - 1) questionIndex = questionIndex + 1; else print("index ranged reached"); }); print(questionIndex); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('My First App'), ), body: Column( children: [ Text(questions[questionIndex]), RaisedButton( child: Text('Answer 1'), onPressed: answerQuestion, ), RaisedButton( child: Text('Answer 2'), onPressed: answerQuestion, ), RaisedButton( child: Text('Answer 3'), onPressed: answerQuestion, ), ], ), ), ); } }
Attribuez la référence de fonction answerQuestion
à la propriété onPressed
. Par conséquent, lorsque vous cliquez sur le bouton, il appellera setState
Les meilleures pratiques ont montré que nous devons éviter de déclarer trop de widgets / layout imbriqués au même endroit. ce que je suggérerais, c'est de séparer le widget scafold et de le déclarer en tant que classe qui étend StatefulWidget. voir l'exemple ci-dessous:
// Question Screen - Stateful class QuestionScreen extends StatefulWidget { QuestionScreen({Key key}) : super(key: key); @override _QuestionScreenState createState() => _QuestionScreenState(); } class _QuestionScreenState extends State<QuestionScreen> { // Must have 3 questions var questions = [ 'What\'s your favorite color?', 'What\'s your favorite animal?', 'What\ s your favorite City?' ]; var questionIndex = 0; void answerQuestion() { // The issue is here where after first question it is not getting updated // the index is out of range. // you may either add one nore quetion to the list and wrap this with conditional statement. if (questions.length - 1 == questionIndex) return; questionIndex = questionIndex + 1; print("question index is : $questionIndex"); setState((){}); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Questions',),), body: Column( children: [ Text (questions[questionIndex]), Expanded(child: ListView.builder( itemBuilder: (context, index) => RaisedButton( child: Text('Answer ${index + 1}'), onPressed: answerQuestion, ), itemCount: questions.length, ), ), ], ), ); } }
Cependant, si j'étais vous, j'aurais créé mes boutons de manière dynamique en fonction de la longueur de ma question comme celle-ci.
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); // MyApp Class - Stateless class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: QuestionScreen(), ); } } // Question Screen - Stateful class QuestionScreen extends StatefulWidget { QuestionScreen({Key key}) : super(key: key); @override _QuestionScreenState createState() => _QuestionScreenState(); } class _QuestionScreenState extends State<QuestionScreen> { // Must have 3 questions var questions = [ 'What\'s your favorite color?', 'What\'s your favorite animal?', 'What\ s your favorite City?' ]; var questionIndex = 0; void answerQuestion() { // The issue is here where after first question it is not getting updated // the index is out of range. // you may either add one nore quetion to the list and wrap this with conditional statement. if (questions.length - 1 == questionIndex) return; questionIndex = questionIndex + 1; print("question index is : $questionIndex"); setState((){}); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Questions',),), body: Column( children: [ Text (questions[questionIndex]), RaisedButton( child: Text('Answer 1'), onPressed: answerQuestion, ), RaisedButton( child: Text('Answer 2'), onPressed: answerQuestion, ), RaisedButton( child: Text('Answer 3'), onPressed: answerQuestion, ), ], ), ); } }
Si la réponse vous a aidé, veuillez la marquer comme correcte