我正在try 做一款关于加密货币的移动应用程序.

我想要像USDT和BTC这样的两个TextFields,它们的工作方式应该是:

假设BTC等于15美元,

而USDT等于1美元,

现在,这些文本字段应该是可编辑的.因此,如果我在BTC Textfield上写1,USDT Textfield应该编辑为15.

另外,当我在USDT文本字段上写30时,BTC字段应该变成2.而且,在这个位置上,如果我从USDT字段中删除0,BTC应该直接更新为"0.thing".

我怎么能做到这一点?

谢谢你的回复!

我设法做到了USDT是输入,BTC是输出.然而,我想让它们既有输入又有输出.下面是我的类、小部件和代码.

import 'package:cryptx/Constants/app_colors.dart';
import 'package:cryptx/Providers/basic_providers.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class USDTInput extends ConsumerWidget {
  const USDTInput({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 12.0),
      child: TextField(
        decoration: InputDecoration(
          icon: SizedBox(
              height: 30,
              child: Image.network(
                  "https://assets.coingecko.com/coins/images/325/small/Tether.png?1668148663")),
          hintText: "USDT",
          border: InputBorder.none,
        ),
        onChanged: (value) {
          ref
              .read(usdProvider.notifier)
              .update((state) => value != "" ? num.parse(value) : 0);
        },
        autocorrect: false,
        keyboardType: const TextInputType.numberWithOptions(decimal: true),
      ),
    );
  }
}
import 'package:cryptx/Objects/coin.dart';
import 'package:cryptx/Providers/basic_providers.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class CoinOutput extends ConsumerWidget {
  const CoinOutput({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    Coin coin = ref.watch(coinDetailProvider) as Coin;
    num usd = ref.watch(usdProvider);
    num amount = usd != 0 ? usd / coin.current_price : 0;

    //return Text(amount.toString());
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 12.0),
      child: TextField(
        decoration: InputDecoration(
          icon: SizedBox(height: 30, child: Image.network(coin.image)),
          hintText: "Coin",
          border: InputBorder.none,
        ),
        controller:
            TextEditingController(text: "$amount ${coin.symbol.toUpperCase()}"),
        readOnly: true,
        autocorrect: false,
        keyboardType: const TextInputType.numberWithOptions(decimal: true),
        onChanged: (value) {
          ref.watch(coin_usdProvider.notifier).update((state) =>
              value != "" ? num.parse(value) / coin.current_price : 0);
        },
      ),
    );
  }
}

推荐答案

试试看这个例子:

import 'package:flutter/material.dart';

const Color darkBlue = Color.fromARGB(255, 18, 32, 47);

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

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final btcTextController = TextEditingController();
  final usdtTextController = TextEditingController();
  final btcFocusNode = FocusNode();
  final usdtFocusNode = FocusNode();
  double btcValue = 15; 
  double usdTValue = 1; 

  String curSelection = "";

  @override
  void initState() {
    btcTextController.addListener(calcBTC);
    usdtTextController.addListener(calcUSDT);
    super.initState();
  }

  void calcBTC() {
    if (btcFocusNode.hasFocus) {
      usdtTextController.clear();
      if (btcTextController.text.isNotEmpty &&
          double.tryParse(btcTextController.text) != null) {
        setState(() {
          usdtTextController.text =
              (double.parse(btcTextController.text) * (btcValue / usdTValue))
                  .toString();
        });
      }
    }
  }

  void calcUSDT() {
    if (usdtFocusNode.hasFocus) {
      btcTextController.clear();
      if (usdtTextController.text.isNotEmpty &&
          double.tryParse(usdtTextController.text) != null) {
        setState(() {
          btcTextController.text =
              (double.parse(usdtTextController.text) * (usdTValue / btcValue))
                  .toString();
        });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(
        scaffoldBackgroundColor: darkBlue,
      ),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: Card(
            color: Colors.white,
            shape:
                RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
            elevation: 4,
            child: Container(
              margin: const EdgeInsets.all(10),
              width: 300,
              height: 300,
              child: Column(
                children: [
                  Expanded(
                    child: TextField(
                      style: const TextStyle(color: Colors.black),
                      controller: btcTextController,
                      focusNode: btcFocusNode,
                      decoration: InputDecoration(
                          filled: true,
                          fillColor: Colors.blue.shade100,
                          labelText: 'BTC',
                          labelStyle: const TextStyle(color: Colors.pink),
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(10),
                            borderSide: BorderSide.none,
                          )),
                    ),
                  ),
                  Expanded(
                      child: TextField(
                        style: const TextStyle(color: Colors.black),
                    controller: usdtTextController,
                    focusNode: usdtFocusNode,
                    decoration: InputDecoration(
                      
                        filled: true,
                        fillColor: Colors.blue.shade100,
                        labelText: 'USDT',
                        labelStyle: const TextStyle(color: Colors.pink),
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10),
                          borderSide: BorderSide.none,
                        )),
                  )),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

您将需要添加更多的验证等.此外,您还可以使用一个单独的函数来进行计算,并使用FocusNodes来决定需要对哪一方进行计算.

Flutter相关问答推荐

自动测试Flutter应用程序进行QA的最佳方法是什么?

Flutter 中不存在URI的目标

自定义ItemBuilderFlutter

如何使DropDownMenu宽度等于TextFormfield?

Flutter飞溅屏幕即使在修改后仍显示默认徽标和背景色

如何在 Dart/Flutter 中克隆 Future

处理 flutter/dart 模型中的空值

谷歌 map 在 flutter 应用程序中显示错误的当前位置

如何在 Flutter 中设计像 zomato 应用程序一样的搜索字段?

如何修改来自合并 list 的 Android list 权限?

Flutter记录返回类型问题

模块是使用不兼容的 kotlin 版本编译的.其元数据的二进制版本是1.8.0,预期版本是1.6

小部件堆栈未显示顶层

在 Flutter 中使用 HardwareKeyboard 时所有键都没有响应

Flutter HLS .m3u8 视频无法实时播放

出现错误;运算符[]不是为对象类型定义的?功能()'

Positioned 的宽度或 SizedBox 的宽度都不适用于堆栈小部件 - Flutter

Flutter:如何将列表转换为字符串?

无法列出 com.facebook.android:facebook-login -Facebook 登录问题的版本

Flutter - 检测手指何时进入容器