如何在Flutter中使Expanded中的文本可滚动以及扫描条形码打开链接

简介: 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。接下来的一段时间我会与大家分享flutter开发中的每日两个小技巧如何在Flutter中使Expanded中的文本可滚动我正在忙着用闪存卡构建一个应用程序,其中包含有关它们的信息,但我遇到了一个我似乎无法弄清楚的愚蠢问题。

如何在Flutter中使Expanded中的文本可滚动

我正在忙着用闪存卡构建一个应用程序,其中包含有关它们的信息,但我遇到了一个我似乎无法弄清楚的愚蠢问题。

为了给出上下文,卡片小部件目前如下所示:

image

如您所见,文本被切断了。我试过将 Expanded 更改为 SingleChildScrollView,但最终我遇到了这种情况:

image

我知道解决方案可能很简单,但我已经摆弄了几个小时

@override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      padding: EdgeInsets.symmetric(vertical: 15, horizontal: 10),
      decoration: BoxDecoration(
        color: Colors.indigo,
        borderRadius: BorderRadius.circular(20),
      ),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Image.asset(
                getCategoryImage(),
                width: 50
              ),
              Container(width: 10),
              Text(
                title,
                style: TextStyle(
                  fontFamily: "Estherilla",
                  fontSize: 30,
                  color: Colors.white
                ),
              )
            ],
          ),
          SingleChildScrollView(
            child: Padding(
              padding: const EdgeInsets.symmetric(vertical: 25),
              child: Text(
                content,
                style: TextStyle(
                  fontSize: 25,
                  color: Colors.white
                ),
              ),
            )
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.end,
            children: <Widget>[
              Text(
                "#$author",
                style: TextStyle(
                  fontFamily: "Estherilla",
                  color: Colors.white,
                  fontSize: 20
                ),
              )
            ],
          )
        ],
      ),
    );
  }
复制代码

最佳答案

包裹您的 SingleChildScrollView里面Expanded像这样的小部件

Column(
   ...
   Expanded(
     child: SingleChildScrollView(...)
   ),
   ...
 )
复制代码

扫描条形码打开链接

我有一个关于 Flutter 中二维码扫描的小问题。二维码读取数据成功后如何打开网址?

我使用这个包来使用 QR 码,用于打开一个 URL,这是我检查来自 QR 码的数据值是否为 URL 的功能,如果它是 URL,则运行该功能以打开网站。

checkingValue() {
    if (_result != null || _result != "") {
      if (_result.contains("https") || _result.contains("http")) {
        return _launchURL(_result);
      } else {
        Toast.show("Invalide URL", context,
            duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM);
      }
    } else {
      return null;
    }
  }
  _launchURL(String urlQRCode) async {
    String url = urlQRCode;
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }
复制代码

_result变量是一个字符串摆脱QR码数据的值。

这是我的全部代码:

class _ScannerPageState extends State<ScannerPage> {
  String _password;
  String _result = "";
  Future _scanQR() async {
    try {
      String qrResult = await BarcodeScanner.scan();
      setState(() {
        _result = qrResult;
      });
    } on PlatformException catch (ex) {
      if (ex.code == BarcodeScanner.CameraAccessDenied) {
        setState(() {
          _result = "Camera permission was denied";
          Toast.show(_result, context,
              duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM);
        });
      } else {
        setState(() {
          _result = "Unknown Error $ex";
          Toast.show(_result, context,
              duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM);
        });
      }
    } on FormatException {
      setState(() {
        _result = "You pressed the back button before scanning anything";
        Toast.show(_result, context,
            duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM);
      });
    } catch (ex) {
      setState(() {
        _result = "Unknown Error $ex";
        Toast.show(_result, context,
            duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM);
      });
    }
  }
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        return showDialog(
            barrierDismissible: false,
            context: context,
            builder: (BuildContext context) {
              return PopUp(
                content: "Are you sure want to exit?",
                cancelText: "No",
                acceptText: "Yes",
                onTapCancel: () => Navigator.of(context).pop(),
                onTapAccept: () async {
                  await SessionManager().removeSession();//
                  await SystemNavigator.pop();
                },
              );
            }
        );
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.lock),
              onPressed: () {
                Navigator.pushNamed(context, '/login');
              },
            ),
          ],
        ),
        body: Column(
          children: <Widget>[
            Text(_result.contains("https") || _result.contains("http") ? _result : "Invalid URL"),
          ],
        ),
        floatingActionButton: FloatingActionButton.extended(
          icon: Icon(Icons.camera_alt),
          label: Text("Scan"),
          onPressed: () => _scanQR(),
        ),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      ),
    );
  }
  checkingValue() {
    if (_result != null || _result != "") {
      if (_result.contains("https") || _result.contains("http")) {
        return _launchURL(_result);
      } else {
        Toast.show("Invalide URL", context,
            duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM);
      }
    } else {
      return null;
    }
  }
  _launchURL(String urlQRCode) async {
    String url = urlQRCode;
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }
}
复制代码

那么,我把checkingValue()扫描二维码后运行它的功能放在哪里?

qrResultcheckingValue方法

Future _scanQR() async {
    try {
      String qrResult = await BarcodeScanner.scan();
      checkingValue(qrResult);
     //....
    }
复制代码

checkingValue 方法

checkingValue(String url) {
    //...
}
复制代码

checkingValue()

setState(() {_result = qrResult;});
checkingValue();
//...



相关文章
|
4月前
|
数据库 容器
Flutter笔记:滚动之-无限滚动与动态加载的实现
Flutter笔记:滚动之-无限滚动与动态加载的实现
218 0
|
4月前
Flutter 组件(二)文本 与 输入框组件
Flutter 组件(二)文本 与 输入框组件
291 0
|
11月前
|
缓存 Java 开发工具
Flutter的文本、图片和按钮使用
Flutter的文本、图片和按钮使用
109 0
|
12月前
|
存储 数据库 索引
Flutter笔记:滚动之-无限滚动与动态加载的实现(GetX简单状态管理版)
本文介绍Flutter中如何实无线滚动(基于GetX简单状态管理而非有状态组件)
112 0
|
2月前
|
UED
Flutter-无限循环滚动标签
Flutter-无限循环滚动标签
33 0
|
2月前
|
移动开发 UED 容器
Flutter-自定义可展开文本控件
Flutter-自定义可展开文本控件
57 0
|
2月前
Flutter 滚动距离来设置TabBar的位置,点击TabBar滚动的到指定的位置
Flutter 滚动距离来设置TabBar的位置,点击TabBar滚动的到指定的位置
|
4月前
|
前端开发 UED 开发者
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化
【4月更文挑战第30天】Flutter开发中,优化列表和滚动视图至关重要。本文介绍了几种优化方法:1) 使用`ListView.builder`和`GridView.builder`实现懒加载;2) 复用子组件以减少实例创建;3) 利用`CustomScrollView`和`Slivers`提升滚动性能;4) 通过`NotificationListener`监听滚动事件;5) 使用`KeepAlive`保持列表项状态。掌握这些技巧能提升应用性能和用户体验。
68 1
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化
|
4月前
|
存储 缓存 监控
【Flutter前端技术开发专栏】Flutter中的列表滚动性能优化
【4月更文挑战第30天】本文探讨了Flutter中优化列表滚动性能的策略。建议使用`ListView.builder`以节省内存,避免一次性渲染所有列表项。为防止列表项重建,可使用`UniqueKey`或`ObjectKey`。缓存已渲染项、减少不必要的重绘和异步加载大数据集也是关键。此外,选择轻量级组件,如`StatelessWidget`,并利用Flutter DevTools监控性能以识别和解决瓶颈。持续测试和调整以提升用户体验。
140 0
【Flutter前端技术开发专栏】Flutter中的列表滚动性能优化
|
4月前
|
前端开发 数据处理
【Flutter 前端技术开发专栏】Flutter 中的滚动性能优化与无限列表实现
【4月更文挑战第30天】本文探讨了 Flutter 中的滚动性能优化和无限列表实现。关键点包括:1) 滚动性能直接影响用户满意度,优化可提升响应速度;2) 影响因素有布局复杂度、频繁重绘和数据处理;3) 优化措施包括懒加载、简化布局、减少不必要的重绘和高效处理数据;4) 无限列表通过监听滚动位置,动态加载新数据;5) 实现时注意加载策略、数据处理效率和内存管理。案例分析和总结强调了优化在实际开发中的重要性。
77 0
【Flutter 前端技术开发专栏】Flutter 中的滚动性能优化与无限列表实现