如何在颤动中显示x个小部件的数量

时间:2020-04-08 22:53:05

标签: flutter

编辑:

这是我的结果:

enter image description here 如您所见,我做了很多工作,现在它是高级的。现在,我在2个绿色按钮顶部的红色中选择了5个数字(5-34-37-42-49)。目前,函数getWidget再次使用gridview以红色返回5个数字,但不确定是否是我需要使用的数字。您能帮我解决5个圆圈大小的问题吗,我需要将它居中放置而不使用滚动。

以下是我完整的代码:

import 'package:flutter/material.dart';
import 'dart:math';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'package:flutter_app/menu_member.dart';
import 'package:flutter_app/globals.dart' as globals;

class Lotto extends StatefulWidget {
  @override
  _LottoState createState() => new _LottoState();
}

class _LottoState extends State<Lotto> {

  @override
  void initState() {
    super.initState();
  }

  var i=1;
  var nb_num=49;
  var no_select=[];
  var no_a_select=5;

  List<Color> colorList = List<Color>.generate(49, (int index) => Colors.lightBlue);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: new AppBar(
            title: new Text('GRILLE DE LOTTO'),
          ),
            body:
            Center(
              child: Column(
                children: <Widget>[
                  Container(
                    width:400,
                    height:30,
                    margin: const EdgeInsets.only(top: 10.0),
                      child : new Text("Selectionnez 5 numéros",textAlign: TextAlign.center,style: TextStyle(fontSize: 30.0),),
                  ),
                  Container(
                    width:400,
                    height:300,
                child: new GridView.count(
                crossAxisCount: 9,
                padding: const EdgeInsets.all(30.0),
                mainAxisSpacing: 4.0,
                crossAxisSpacing: 4.0,
                children: new List<Widget>.generate(49, (index) {
                  return new GestureDetector(
                    onTap: () {
                      setState(() {
                        if (colorList[index] == Colors.lightBlue) {
                          if (no_select.length<no_a_select) {
                            colorList[index] = Colors.redAccent;
                            no_select.add(index+1);
                          }
                          else {
                            showDialog(
                                context: context,
                                builder: (BuildContext context){
                                  return AlertDialog(
                                    title: Text("INFORMATION"),
                                    content: Text("Vous ne pouvez pas sélectionner plus de 5 numéros !!!"),
                                  );
                                }
                            );
                          }
                          print(no_select);
                        }
                        else {
                          colorList[index] = Colors.lightBlue;
                          no_select.remove(index+1);
                          print(no_select);
                        }
                      });
                    },
                    child: Container(
                      child: ClipOval(
                        child: Container(
                          color: colorList[index],
                          height: 20.0,
                          width: 20.0,
                          child: Center(
                            child: new Text((index+1).toString(),
                                style: TextStyle(color: Colors.white, fontSize: 24),
                                textAlign: TextAlign.center),
                          ),
                        ),
                      ),
                    ),
                  );
                }
                ),
              ),
                  ),
                  Container(
                    width:400,
                    height:30,
                    margin: const EdgeInsets.only(top: 10),
                      child : new Text("Vos Numéros",textAlign: TextAlign.center,style: TextStyle(fontSize: 30.0),),
                  ),
                  Container(
                    width:400,
                    height:80,
                    margin: const EdgeInsets.only(top: 10.0),
                    decoration: BoxDecoration(
                      border: Border.all(
                    color: Colors.lightBlueAccent,
                    width: 2,
                  ),
                      borderRadius: BorderRadius.circular(12),
                    ),
                  child:
                    getWidget()
                  ),
                  Container(
                    width:300,
                    height:45,
                    margin: const EdgeInsets.only(top: 10.0),
                    child:
                  RaisedButton(
                    color: Colors.green,
                    textColor: Colors.white,
                    padding: EdgeInsets.fromLTRB(9, 9, 9, 9),
                    child: Text('TIRAGE ALEATOIRE'),
                    onPressed: () {
                      Select_numbers();
                    },
                  ),
                  ),
                  Container(
                    width:300,
                    height:45,
                    margin: const EdgeInsets.only(top: 10.0),
                    child:
                  RaisedButton(
                    color: Colors.green,
                    textColor: Colors.white,
                    padding: EdgeInsets.fromLTRB(9, 9, 9, 9),
                    child: Text('VALIDER VOTRE GRILLE'),
                    onPressed: () {
                      Valide_grille();
                    },
                  ),
                  ),
                  ]
              )
                          ),
                        ),
                    );
  }

  getWidget() {
    if (no_select.length==0) {
      return Text("Pas de numéros");
    }
    else {
      return GridView.count(
          crossAxisCount: 5,
          padding: const EdgeInsets.all(10.0),
          mainAxisSpacing: 4.0,
          crossAxisSpacing: 4.0,
          children: new List<Widget>.generate(no_select.length, (index) {
            return  ClipOval(
            child: Container(
            color: Colors.red,
    height: 20.0,
    width: 20.0,
    child: Center(
    child: new Text((no_select[index].toString()),
    style: TextStyle(color: Colors.white, fontSize: 24),
    textAlign: TextAlign.center),
    ),
    ),
    );
          }
    )
      );
    }
  }

  Select_numbers() {
    setState(() {
      var j = 1;
      var num_sel;
      var pos_sel;
      no_select=[];
      colorList=[];
      colorList=List<Color>.generate(49, (int index) => Colors.lightBlue);
      var rng = new Random();
      List tab=[];
      tab = List.generate(49, (int index) => index + 1);
      print (tab);
      while (j <= no_a_select) {
        pos_sel = rng.nextInt(tab.length-1);
        num_sel=tab[pos_sel];
        no_select.add(num_sel);
        colorList[num_sel-1] = Colors.redAccent;
        tab.remove(num_sel);
        print(tab);
        j++;
      }
      print(no_select);
    });
  }

  Future Valide_grille() async{
    // For CircularProgressIndicator.
    bool visible = false ;
    // Showing CircularProgressIndicator.
    setState(() {
      visible = true ;
    });

    // SERVER LOGIN API URL
    var url = 'https://www.easytrafic.fr/game_app/valide_lotto.php';

    // Store all data with Param Name.
    var data = {'id_membre':globals.id_membre, 'result':no_select};

    print (data);

    var grille_encode=jsonEncode(data);

    print(grille_encode);

    // Starting Web API Call.
    var response = await http.post(url, body: grille_encode,headers: {'content-type': 'application/json','accept': 'application/json','authorization': globals.token});

    print(response.body);

    // Getting Server response into variable.
    var message = json.decode(response.body);

    // If the Response Message is Matched.
    if(message == 'OK')
    {
      print('VALIDATION DE LA GRILLE OK');
      // Hiding the CircularProgressIndicator.
      setState(() {
        visible = false;
      });

    }else{
      // Hiding the CircularProgressIndicator.
      setState(() {
        visible = false;
      });

      // Showing Alert Dialog with Response JSON Message.
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: new Text(message),
            actions: <Widget>[
              FlatButton(
                child: new Text("OK"),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
            ],
          );
        },
      );
    }
  }
}

2 个答案:

答案 0 :(得分:1)

我认为您需要一个Flutter simple Alert Dialog而不是print命令。因此,更改您的代码:

 print(
   "Vous ne pouvez pas sélectionner plus de 5 numéros !!!");

至:

showDialog(
     context: context,
     builder: (BuildContext context){
        return AlertDialog(
          title: Text("Alert Dialog"),
          content: Text("Vous ne pouvez pas sélectionner plus de 5 numéros !!!"),
          );
        }
     );

因为print命令将其输出发送到console。 建议您阅读以下内容:https://dev.to/mightytechno/flutter-alert-dialog-to-custom-dialog-1ok4

Edit:

为了在按钮之间有49个圆圈,您需要移动以下代码行:

          Expanded(
            flex:2,
            child:
            RaisedButton(
              color: Colors.green,
              textColor: Colors.white,
              padding: EdgeInsets.fromLTRB(9, 9, 9, 9),
              child: Center(child: Text('TIRAGE ALEATOIRE')),
              onPressed: () {
                Select_numbers();
              },
            ),
          ),
这些行之后的

  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: new AppBar(
          title: new Text('GRILLE DE LOTTO'),
        ),
        body:
        Center(
            child: Column(
                children: <Widget>[

此外,为了使RaisedButton的角变圆,您可以添加以下代码:

              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(40),),

RaisedButton(之后的

答案 1 :(得分:0)

您可以在下面复制粘贴运行完整代码
您可以使用列表保留每个数字的颜色
代码段

List<Color> colorList = List<Color>.generate(49, (int index) => Colors.lightBlue);
...
setState(() {
                    if (colorList[index] == Colors.lightBlue) {
                      if (no_select.length < no_a_select) {
                        colorList[index] = Colors.redAccent;
...
 child: Container(
                      color: colorList[index],  

工作演示

enter image description here

完整代码

import 'package:flutter/material.dart';

class Lotto extends StatefulWidget {
  @override
  _LottoState createState() => new _LottoState();
}

class _LottoState extends State<Lotto> {
  Color color;
  void message() {
    print('Clicked');
  }

  List<Color> colorList = List<Color>.generate(49, (int index) => Colors.lightBlue);

  @override
  void initState() {
    super.initState();

    color = Colors.lightBlue;
    print(colorList[0].toString());
  }

  var i = 1;
  var nb_num = 49;
  var no_select = [];
  var no_a_select = 5;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            children: <Widget>[
              Expanded(
                flex: 3,
                child: new GridView.count(
                  crossAxisCount: 7,
                  children: new List<Widget>.generate(49, (index) {
                    return new GestureDetector(
                      onTap: () {
                        setState(() {
                          if (colorList[index] == Colors.lightBlue) {
                            if (no_select.length < no_a_select) {
                              colorList[index] = Colors.redAccent;
                              no_select.add(index + 1);
                            } else {
                              print(
                                  "Vous ne pouvez pas sélectionner plus de 5 numéros !!!");
                            }
                            print(no_select);
                          } else {
                            colorList[index] = Colors.lightBlue;
                            no_select.remove(index + 1);
                            print(no_select);
                          }
                        });
                      },
                      child: Container(
                        child: ClipOval(
                          child: Container(
                            color: colorList[index],
                            height: 20.0,
                            width: 20.0,
                            child: Center(
                              child: new Text((index + 1).toString(),
                                  style: TextStyle(color: Colors.white, fontSize: 24),
                                  textAlign: TextAlign.center),
                            ),
                          ),
                        ),
                      ),
                    );
                  }),
                ),
              ),
              Expanded(flex: 1, child: Text("abc")),
            ],

          ),
        ),
      ),
    );
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Lotto(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}