Search code examples
flutterdarttextfieldcurrency

How to change one currency textfield via another currency textfield in flutter?


Can you tell me how I calculate my one currency via listen my another currency textfield?

Now Still I have a problem. whenever my text field is empty i got an exception like

Invalid radix-10 number (at character 1) 0.0 ^

or

Invalid number (at character 1)

^

How can I solve this? Help me out. please. Thanks in advance.

final silverCoinController = TextEditingController();
  final goldCoinController = TextEditingController();

int silver = 0;
  double gold = 0.0;
  _convertSilver() {
    setState(() {
       //define your own formula
      silverCoinController.text = (gold * 1000).toString();
      print(gold);
    });
  }

  _convertGold() {
    setState(() {
       //define your own formula
      goldCoinController.text = (silver / 1000).toString();
      print(silver);
    });
  }

  _silverValue() {
    silver = int.parse(silverCoinController.text);
  }

  _goldValue() {
    gold = double.parse(goldCoinController.text);
  }

@override
  void initState() {
    silverCoinController.addListener(_silverValue);
    goldCoinController.addListener(_goldValue);

    super.initState();
  }

@override
  void dispose() {
    silverCoinController.dispose();
    goldCoinController.dispose();
    super.dispose();
  }

. . .

Column(
 children: <Widget> [
  TextField(
   keyboardType: TextInputType.numberWithOptions(decimal: true)
   onChanged: (text) {
     _convertGold();
   },
   controller: silverCoinController,
  ),
  TextField(
   keyboardType: TextInputType.numberWithOptions(decimal: true)
   onChanged: (text) {
     _convertSilver();
   },
   controller: silverCoinController,
  ),
 ]
)

Solution

  • You can copy paste run full code below
    Step 1: sliver use double
    Step 2: Check isNotEmpty for TextEditingController and onChanged

    _silverValue() {
    if (silverCoinController.text.isNotEmpty) {
      silver = double.parse(silverCoinController.text);
     }
    }
    ...
    onChanged: (text) {
                  if (text.isNotEmpty) {
                    _convertGold();
                  }
                }
    

    Step 3: Two TextField use the same silverCoinController need to modify

    working demo

    enter image description here

    full code

    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,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          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> {
      final silverCoinController = TextEditingController();
      final goldCoinController = TextEditingController();
    
      double silver = 0.0;
      double gold = 0.0;
    
      _convertSilver() {
        setState(() {
          //define your own formula
          silverCoinController.text = (gold * 1000).toString();
          print(gold);
        });
      }
    
      _convertGold() {
        setState(() {
          //define your own formula
          goldCoinController.text = (silver / 1000).toString();
          print(silver);
        });
      }
    
      _silverValue() {
        if (silverCoinController.text.isNotEmpty) {
          silver = double.parse(silverCoinController.text);
        }
      }
    
      _goldValue() {
        if (goldCoinController.text.isNotEmpty) {
          gold = double.parse(goldCoinController.text);
        }
      }
    
      @override
      void initState() {
        silverCoinController.addListener(_silverValue);
        goldCoinController.addListener(_goldValue);
    
        super.initState();
      }
    
      @override
      void dispose() {
        silverCoinController.dispose();
        goldCoinController.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(children: <Widget>[
              TextField(
                decoration: InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: 'Sliver',
                ),
                keyboardType: TextInputType.numberWithOptions(decimal: true),
                onChanged: (text) {
                  if (text.isNotEmpty) {
                    _convertGold();
                  }
                },
                controller: silverCoinController,
              ),
              TextField(
                decoration: InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: 'Gold',
                ),
                keyboardType: TextInputType.numberWithOptions(decimal: true),
                onChanged: (text) {
                  if (text.isNotEmpty) {
                    _convertSilver();
                  }
                },
                controller: goldCoinController,
              ),
            ]),
          ),
        );
      }
    }