IF И ELSE ДЛЯ ФЛАТТЕРА | ПРИНЦИП РАБОТЫ FLUTTER

#flutter #dart

#флаттер #dart

Вопрос:

Я только начал учиться программировать с помощью Flutter amp; Dart. Я не мог полностью понять принцип работы Flutter. В коде, которым я поделился ниже, нет ошибок. Но я не получаю желаемого результата. В коде счетчик начинается с 0. И на счетчике есть текст, который показывает, является ли этот счетчик четным или нечетным. Это делается при нажатии кнопки. Но кнопка срабатывает только один раз. Счетчик увеличивается, но текст не меняется.

 import 'package:flutter/material.dart';

void main() => runApp(MyApp());

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

class MyHomePage extends StatefulWidget {
  final String title;

  const MyHomePage({
    Key? key,
    required this.title,
  }) : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  String evenNumber = "Even Number";
  String oddNumber = "Odd Number";

  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: [
            Text(_counter / 2 == 0 ? evenNumber : oddNumber),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}
 

Комментарии:

1.Существует также isEven свойство int api.dart.dev/stable/2.14.4/dart-core/int/isEven.html

Ответ №1:

Измените эту строку:

 _counter / 2 == 0 ? evenNumber : oddNumber
 

Для:

 _counter % 2 == 0 ? evenNumber : oddNumber
 

Оператор ‘%’ вычисляет остаток, который вам нужен. Не половина (_counter / 2) значения счетчика.

Ответ №2:

Вы не получите желаемого результата, потому что используете обычное division использование вместо modulo . / Вы только проверяете, соответствует ли результат 0 , и % вы можете проверить, четное ли число. Чтобы исправить это, измените свой Text виджет на следующий.

 Text(_counter % 2 == 0 ? evenNumber : oddNumber),
 

Теперь ваш полный код должен выглядеть так.

 import 'package:flutter/material.dart';

void main() => runApp(MyApp());

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

class MyHomePage extends StatefulWidget {
  final String title;

  const MyHomePage({
    Key? key,
    required this.title,
  }) : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  String evenNumber = "Even Number";
  String oddNumber = "Odd Number";

  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: [
            Text(_counter / 2 == 0 ? evenNumber : oddNumber),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}
 

Ответ №3:

Да, я обычно использовал оператор% из блока if, подобного приведенному ниже, но я не мог понять, что ошибка была от оператора, поскольку я предполагаю, что это было из блока кода. Так почему я не могу получить желаемый результат при таком использовании?

      class _MyHomePageState extends State<MyHomePage> {
       int _counter = 0;
        String evenNumber = "Even Number";
          String oddNumber = "Odd Number";

        void _incrementCounter() {
          setState(() {
         _counter  ;
  
        if (_counter % 2 == 0){
         evenNumber = evenNumber;
          } else {
            evenNumber = oddNumber;
            }
            });
            }

              @override
          Widget build(BuildContext context) {
           return Scaffold(
            appBar: AppBar(
       title: Text(widget.title),
        ),
            body: Center(
            child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
              children: [
             Text(evenNumber),