#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),