Виджет переключения флаттера - я хочу, чтобы он выполнял функцию, когда он активен, что делать? - PullRequest
0 голосов
/ 23 марта 2020

У меня проблема с виджетом переключателя в флаттере. Я хочу выполнять функцию onChanged только тогда, когда я ее активирую, но каждый раз, когда я нажимаю на переключатель, даже когда он не активен, он выполняет функцию, и у меня появляется всплывающее меню.

new Switch(
  value: false,

  onChanged: (bool isOn) {
    if(isOn){
      setState(() {
        return showDialog(
          context: context,
          barrierDismissible: false,
          builder: (context) {
            return AlertDialog(
              key: _alertDialogKey,
              contentPadding: EdgeInsets.only(left: 25, right: 25),
              title: Center(
                child: Text("Choisissez une filiale")
              ),
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.all(
                Radius.circular(20.0)),
              ),
              content: Container(
                height: 350,
                width: 300,
                child: ListView.builder(
                  itemCount: litems.length,
                  itemBuilder: (_, index) {
                    return RaisedButton(
                      onPressed: () => popupAppuieSurUneFiliale(  index)
                        //changementAffiliation(litems[index]),
                        child: Text(
                          litems[index],
                          style: TextStyle(color: Colors.white),
                        ),
                      color: Colors.black,
                    );
                  }
                ),
              ), 
              actions:[
                RaisedButton(
                  child: Text("Annuler",),
                  onPressed: (){
                    Navigator.of(context).pop();
                  },
                  color: Colors.blue,
                ),
              ]
            );
          }
        );
      });
    } else(){

    };
  }
);

Демо

1 Ответ

0 голосов
/ 25 марта 2020

Вы можете скопировать и вставить полный код ниже
Вы можете объявить bool _isOn и установить false, а затем в onChanged изменить значение
фрагмент кода

 bool _isOn = false;
 ...
 Switch(
                value: _isOn,
                onChanged: (bool isOn) {
                  setState(() {
                    _isOn = isOn;
                  });

рабочая демоверсия

enter image description here

полный код

import 'package:flutter/material.dart';

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

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

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;
  List<String> litems = ["test"];
  bool _isOn = false;

  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>[
            Switch(
                value: _isOn,
                onChanged: (bool isOn) {
                  setState(() {
                    _isOn = isOn;
                  });

                  if (isOn) {
                    return showDialog(
                        context: context,
                        barrierDismissible: false,
                        builder: (context) {
                          return AlertDialog(
                              //key: _alertDialogKey,
                              contentPadding:
                                  EdgeInsets.only(left: 25, right: 25),
                              title:
                                  Center(child: Text("Choisissez une filiale")),
                              shape: RoundedRectangleBorder(
                                borderRadius:
                                    BorderRadius.all(Radius.circular(20.0)),
                              ),
                              content: Container(
                                height: 350,
                                width: 300,
                                child: ListView.builder(
                                    itemCount: litems.length,
                                    itemBuilder: (_, index) {
                                      return RaisedButton(
                                        onPressed: () => null,
                                        //changementAffiliation(litems[index]),
                                        child: Text(
                                          litems[index],
                                          style: TextStyle(color: Colors.white),
                                        ),
                                        color: Colors.black,
                                      );
                                    }),
                              ),
                              actions: [
                                RaisedButton(
                                  child: Text(
                                    "Annuler",
                                  ),
                                  onPressed: () {
                                    Navigator.of(context).pop();
                                  },
                                  color: Colors.blue,
                                ),
                              ]);
                        });
                  } else
                    () {};
                }),
            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),
      ),
    );
  }
}
...