mirror of
https://github.com/rjNemo/bmi_calculator_app
synced 2026-06-06 02:16:41 +00:00
feat: add more info
This commit is contained in:
parent
43868f7d93
commit
1bb30cce2a
5 changed files with 291 additions and 91 deletions
92
CONTRIBUTING.md
Normal file
92
CONTRIBUTING.md
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
# Contributing
|
||||
|
||||
When contributing to this repository, please first discuss the change you wish to make via issue,
|
||||
email, or any other method with the owners of this repository before making a change.
|
||||
|
||||
Please note we have a code of conduct, please follow it in all your interactions with the project.
|
||||
|
||||
## Pull Request Process
|
||||
|
||||
1. Ensure any install or build dependencies are removed before the end of the layer when doing a
|
||||
build.
|
||||
2. Update the [README.md](README.md) with details of changes to the interface, this includes new environment
|
||||
variables, exposed ports, useful file locations and container parameters.
|
||||
3. Increase the version numbers in any examples files and the [README.md](README.md) to the new version that this
|
||||
Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/).
|
||||
4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you
|
||||
do not have permission to do that, you may request the second reviewer to merge it for you.
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
### Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||
nationality, personal appearance, race, religion, or sexual identity and
|
||||
orientation.
|
||||
|
||||
### Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
- Using welcoming and inclusive language
|
||||
- Being respectful of differing viewpoints and experiences
|
||||
- Gracefully accepting constructive criticism
|
||||
- Focusing on what is best for the community
|
||||
- Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
- The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
- Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
- Public or private harassment
|
||||
- Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
- Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
### Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
### Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
### Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at [ruidy.nemausat@gmail.com]. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
### Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at [http://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
21
LICENSE.md
Normal file
21
LICENSE.md
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
# MIT License
|
||||
|
||||
Copyright (c) [2021] [Ruidy]
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
73
README.md
73
README.md
|
|
@ -12,8 +12,77 @@ Compute and track your Body Mass Index and Body Fat Percentage
|
|||
- [ ] bmi tracker: date, value, graph
|
||||
- [ ] profile: save age, height, genre, local storage
|
||||
- [x] bmi on second screen
|
||||
- [ ] feedback on genre select
|
||||
- [x] feedback on genre select
|
||||
|
||||
* [doc](https://www.santepratique.fr/nutrition/calcul-imc)
|
||||
## Getting Started
|
||||
|
||||
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
You need a recent version of Flutter. Please follow installation steps for your platform from the official [documentation](https://flutter.dev/docs/get-started/install).
|
||||
|
||||
### Installing
|
||||
|
||||
Clone the repository using
|
||||
|
||||
```shell
|
||||
git clone https://github.com/rjNemo/bmi_calculator_app.git
|
||||
```
|
||||
|
||||
And run the development application with
|
||||
|
||||
```shell
|
||||
flutter run
|
||||
```
|
||||
|
||||
## Running the tests
|
||||
|
||||
Explain how to run the automated tests for this system
|
||||
|
||||
### Break down into end to end tests
|
||||
|
||||
Explain what these tests test and why
|
||||
|
||||
```shell script
|
||||
Give an example
|
||||
```
|
||||
|
||||
### And coding style tests
|
||||
|
||||
Explain what these tests test and why
|
||||
|
||||
```shell script
|
||||
Give an example
|
||||
```
|
||||
|
||||
## Deployment
|
||||
|
||||
Add additional notes about how to deploy this on a live system
|
||||
|
||||
## Built With
|
||||
|
||||
- [Flutter](https://flutter.dev/) - Beautiful native apps in record time
|
||||
|
||||
## Contributing
|
||||
|
||||
Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.
|
||||
|
||||
## Versioning
|
||||
|
||||
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/rjNemo/bmi_calculator_app/tags).
|
||||
|
||||
## Authors
|
||||
|
||||
- **Ruidy** - _Initial work_ - [Ruidy](https://github.com/rjNemo)
|
||||
|
||||
See also the list of [contributors](https://github.com/rjNemo/bmi_calculator_app/contributors) who participated in this project.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
- [doc](https://www.santepratique.fr/nutrition/calcul-imc)
|
||||
- [design inspiration](https://dribbble.com/shots/13913052-DailyUI-004-Calculator)
|
||||
|
|
|
|||
|
|
@ -28,95 +28,98 @@ class _CalculatorPageState extends State<CalculatorPage> {
|
|||
(1.2 * bodyMassIndex() + .23 * _age - 10.8 * _gender - 5.4).round();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(widget.title),
|
||||
),
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: <Widget>[
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Ink(
|
||||
decoration: const ShapeDecoration(
|
||||
color: Colors.lightGreen,
|
||||
shape: CircleBorder(),
|
||||
),
|
||||
child: IconButton(
|
||||
icon: const Icon(Icons.female),
|
||||
tooltip: 'Choose female gender',
|
||||
onPressed: () {
|
||||
setState(() => _gender = 0);
|
||||
},
|
||||
color: Colors.white,
|
||||
),
|
||||
Widget build(BuildContext context) {
|
||||
bool _isWoman = _gender == 0;
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(widget.title),
|
||||
),
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: <Widget>[
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Ink(
|
||||
decoration: ShapeDecoration(
|
||||
color: _isWoman ? Colors.lightGreen : null,
|
||||
shape: CircleBorder(),
|
||||
),
|
||||
child: IconButton(
|
||||
icon: Icon(Icons.female),
|
||||
tooltip: 'Choose female gender',
|
||||
onPressed: () {
|
||||
setState(() => _gender = 0);
|
||||
},
|
||||
color: _isWoman ? Colors.white : Colors.lightGreen,
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Ink(
|
||||
decoration: const ShapeDecoration(
|
||||
color: Colors.lightGreen,
|
||||
shape: CircleBorder(),
|
||||
),
|
||||
child: IconButton(
|
||||
icon: const Icon(Icons.male),
|
||||
tooltip: 'Choose male gender',
|
||||
onPressed: () {
|
||||
setState(() => _gender = 1);
|
||||
},
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Ink(
|
||||
decoration: ShapeDecoration(
|
||||
color: !_isWoman ? Colors.lightGreen : null,
|
||||
shape: CircleBorder(),
|
||||
),
|
||||
child: IconButton(
|
||||
icon: Icon(Icons.male),
|
||||
tooltip: 'Choose male gender',
|
||||
onPressed: () {
|
||||
setState(() => _gender = 1);
|
||||
},
|
||||
color: !_isWoman ? Colors.white : Colors.lightGreen,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Text('Weight'),
|
||||
Text("${_weight.round().toString()} kg"),
|
||||
Slider(
|
||||
value: _weight,
|
||||
min: 0,
|
||||
max: 100,
|
||||
divisions: 100,
|
||||
label: _weight.round().toString(),
|
||||
onChanged: (double value) => setState(() => _weight = value),
|
||||
),
|
||||
Text('Height'),
|
||||
Text("${_height.round().toString()} cm"),
|
||||
Slider(
|
||||
value: _height,
|
||||
min: 100,
|
||||
max: 200,
|
||||
divisions: 100,
|
||||
label: _height.round().toString(),
|
||||
onChanged: (double value) => setState(() => _height = value),
|
||||
),
|
||||
Text('Age'),
|
||||
Text("${_age.round().toString()} years old"),
|
||||
Slider(
|
||||
value: _age,
|
||||
min: 10,
|
||||
max: 100,
|
||||
divisions: 100,
|
||||
label: _age.round().toString(),
|
||||
onChanged: (double value) => setState(() => _age = value),
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
print(
|
||||
"BMI: ${bodyMassIndex()}; BFP: ${bodyFatPercentage()}");
|
||||
Navigator.pushNamed(
|
||||
context,
|
||||
ResultPage.routeName,
|
||||
arguments: Results(bodyMassIndex(), bodyFatPercentage()),
|
||||
);
|
||||
},
|
||||
child: Text('Calculate'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Text('Weight'),
|
||||
Text("${_weight.round().toString()} kg"),
|
||||
Slider(
|
||||
value: _weight,
|
||||
min: 0,
|
||||
max: 100,
|
||||
divisions: 100,
|
||||
label: _weight.round().toString(),
|
||||
onChanged: (double value) => setState(() => _weight = value),
|
||||
),
|
||||
Text('Height'),
|
||||
Text("${_height.round().toString()} cm"),
|
||||
Slider(
|
||||
value: _height,
|
||||
min: 100,
|
||||
max: 200,
|
||||
divisions: 100,
|
||||
label: _height.round().toString(),
|
||||
onChanged: (double value) => setState(() => _height = value),
|
||||
),
|
||||
Text('Age'),
|
||||
Text("${_age.round().toString()} years old"),
|
||||
Slider(
|
||||
value: _age,
|
||||
min: 10,
|
||||
max: 100,
|
||||
divisions: 100,
|
||||
label: _age.round().toString(),
|
||||
onChanged: (double value) => setState(() => _age = value),
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
print("BMI: ${bodyMassIndex()}; BFP: ${bodyFatPercentage()}");
|
||||
Navigator.pushNamed(
|
||||
context,
|
||||
ResultPage.routeName,
|
||||
arguments: Results(bodyMassIndex(), bodyFatPercentage()),
|
||||
);
|
||||
},
|
||||
child: Text('Calculate'),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,15 @@ class Results {
|
|||
int bodyFatPercentage;
|
||||
|
||||
Results(this.bodyMassIndex, this.bodyFatPercentage);
|
||||
|
||||
String category() {
|
||||
if (bodyMassIndex > 12) {
|
||||
return "Normal";
|
||||
}
|
||||
return "Too much";
|
||||
}
|
||||
|
||||
Icon icon() => Icon(Icons.female);
|
||||
}
|
||||
|
||||
class ResultPage extends StatelessWidget {
|
||||
|
|
@ -20,15 +29,21 @@ class ResultPage extends StatelessWidget {
|
|||
),
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: <Widget>[
|
||||
results.icon(), //
|
||||
Text("Below are your results given your height, age and gender."),
|
||||
Text(
|
||||
"Your results: BMI: ${results.bodyMassIndex}; BFP: ${results.bodyFatPercentage}"),
|
||||
"Your BMI is ${results.bodyMassIndex}, and your BFP is ${results.bodyFatPercentage}, indicating your weight is in the ${results.category()} for adults of your height.",
|
||||
),
|
||||
Text(
|
||||
"Maintaining a healthy weight may reduce the risk of chronic diseases associated with overweight and obesity.",
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: Text('Go back!'),
|
||||
child: Text('Recalculate BMI'),
|
||||
),
|
||||
],
|
||||
)),
|
||||
|
|
|
|||
Loading…
Reference in a new issue