Flutter用户中心定位插件flutter_finder_usercentric的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter用户中心定位插件flutter_finder_usercentric的使用

flutter_finder_usercentric 是一个用于在Flutter应用中通过语义角色(如按钮、文本框等)和语义标签来查找元素的插件。它可以帮助开发者更方便地进行UI测试,确保应用的可访问性和用户体验。

如何使用?

下面是一个完整的示例Demo,展示了如何使用 flutter_finder_usercentric 插件来查找不同类型的UI元素,并进行相应的测试。

1. 创建一个简单的Flutter应用

首先,我们创建一个包含多种UI组件的应用,包括 TextFieldSliderFloatingActionButtonElevatedButton 等。

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

class TestApp extends StatelessWidget {
  TestApp({super.key});
  final TextEditingController controller = TextEditingController();
  final double _currentSliderValue = 20;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Test App',
      home: Scaffold(
        body: Column(
          children: [
            // 简单的文本框
            TextField(
              key: const Key('SimpleTextFieldKey'),
              controller: controller,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                hintText: 'Simple TextField',
              ),
            ),
            // 另一个简单的文本框
            TextField(
              key: const Key('AnotherSimpleTextFieldKey'),
              controller: controller,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                hintText: 'Another Simple TextField',
              ),
            ),
            // 合并语义的滑块
            MergeSemantics(
              key: const Key("SimpleSliderKey"),
              child: Row(
                children: [
                  const Text("Simple slider"),
                  Slider(
                    value: _currentSliderValue,
                    max: 100,
                    divisions: 5,
                    label: _currentSliderValue.round().toString(),
                    onChanged: (double value) {},
                  )
                ],
              ),
            ),
            // 带有提示信息的浮动按钮
            FloatingActionButton(
              key: const Key('SimpleFloatingActionButtonTooltipKey'),
              tooltip: 'SimpleFloatingActionButtonTooltip',
              onPressed: () {},
            ),
            // 简单的 ElevatedButton
            ElevatedButton(
              onPressed: () {},
              key: const Key('SimpleElevatedButtonKey'),
              child: const Text('SimpleElevatedButtonText'),
            ),
            // 带有提示信息的 ElevatedButton
            Tooltip(
              message: "ElevatedButtonWithTooltip",
              child: ElevatedButton(
                onPressed: () {},
                key: const Key('ElevatedButtonWithTooltipKey'),
                child: const Text('ElevatedButtonWithTooltipText'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
2. 编写测试代码

接下来,我们编写测试代码,使用 flutter_finder_usercentric 插件来查找和验证这些UI元素。

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_finder_usercentric/finder.dart';

void main() {
  testWidgets('通过可访问名称查找元素', (tester) async {
    await tester.pumpWidget(TestApp());

    // 查找带有特定文本的 ElevatedButton
    var finderByAccessibleName = find.byAccessibleName("SimpleElevatedButtonText");
    expect(finderByAccessibleName, findsOneWidget);
    expectKey(finderByAccessibleName, "ElevatedButton", "SimpleElevatedButtonKey");

    // 查找带有特定提示信息的 ElevatedButton
    var tooltipFinder = find.byAccessibleName("ElevatedButtonWithTooltip");
    expect(tooltipFinder, findsOneWidget);
    expect((tester.widget(tooltipFinder) as Tooltip).message, "ElevatedButtonWithTooltip");
  });

  testWidgets('通过可访问角色和名称查找元素', (tester) async {
    await tester.pumpWidget(TestApp());

    // 查找带有特定文本的 ElevatedButton
    var finderByAccessibleRoleAndName = find.byAccessibleRoleAndName(
      tester, 
      AccessibleRole.button, 
      "SimpleElevatedButtonText"
    );
    expect(finderByAccessibleRoleAndName, findsOneWidget);
    expectKey(finderByAccessibleRoleAndName, "ElevatedButton", "SimpleElevatedButtonKey");

    // 查找带有特定文本的 TextField
    var textFieldFinder = find.byAccessibleRoleAndName(
      tester, 
      AccessibleRole.textField, 
      "Simple TextField"
    );
    expect(textFieldFinder, findsOneWidget);
    expectKey(textFieldFinder, "TextField", "SimpleTextFieldKey");

    // 查找带有特定文本的 Slider
    var sliderFinder = find.byAccessibleRoleAndName(
      tester, 
      AccessibleRole.slider, 
      "Simple slider"
    );
    expect(sliderFinder, findsOneWidget);
    expect(sliderFinder.found.first.widget.key, const Key("SimpleSliderKey"));

    // 查找带有特定提示信息的 FloatingActionButton
    var floatingActionButtonFinder = find.byAccessibleRoleAndName(
      tester, 
      AccessibleRole.button, 
      "SimpleFloatingActionButtonTooltip"
    );
    expect(floatingActionButtonFinder, findsOneWidget);
    expect((tester.widget(floatingActionButtonFinder) as Tooltip).message, "SimpleFloatingActionButtonTooltip");
  });

  testWidgets('查找不存在的元素', (tester) async {
    await tester.pumpWidget(TestApp());

    // 查找不存在的元素
    var nonExistingFinder = find.byAccessibleName("NonExisting");
    expect(nonExistingFinder, findsNothing);

    // 查找不存在的 TextField
    var nonExistingTextFieldFinder = find.byAccessibleRoleAndName(
      tester, 
      AccessibleRole.textField, 
      "NonExisting"
    );
    expect(nonExistingTextFieldFinder, findsNothing);

    // 查找不存在的 Button
    var nonExistingButtonFinder = find.byAccessibleRoleAndName(
      tester, 
      AccessibleRole.button, 
      "NonExisting"
    );
    expect(nonExistingButtonFinder, findsNothing);
  });
}

// 辅助函数:检查元素的类型和键是否匹配
void expectKey(Finder finder, String type, String key) {
  expect(
    find.ancestor(
      of: finder,
      matching: find.byWidgetPredicate((widget) =>
          widget.runtimeType.toString() == type && widget.key == Key(key)),
    ),
    findsOneWidget,
  );
}

更多关于Flutter用户中心定位插件flutter_finder_usercentric的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter用户中心定位插件flutter_finder_usercentric的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用flutter_finder_usercentric插件的代码示例。flutter_finder_usercentric是一个帮助开发者在Flutter应用中实现用户中心定位功能的插件。需要注意的是,由于该插件可能并非官方或广泛知名的插件,以下代码是基于假设该插件存在并且其功能类似于用户定位的一般插件。如果插件的API有所不同,请参考其官方文档进行调整。

首先,确保你已经在pubspec.yaml文件中添加了该插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_finder_usercentric: ^x.y.z  # 替换为实际版本号

然后,运行flutter pub get来获取依赖。

接下来,在你的Flutter应用中,你可以按照以下步骤使用flutter_finder_usercentric插件来实现用户中心定位功能:

  1. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter_finder_usercentric/flutter_finder_usercentric.dart';
  1. 请求权限并获取位置

在你的应用中,你需要请求位置权限并获取当前用户的位置。以下是一个简单的示例,展示了如何使用flutter_finder_usercentric(假设其提供了类似的功能)来实现这一点:

import 'package:flutter/material.dart';
import 'package:flutter_finder_usercentric/flutter_finder_usercentric.dart';
import 'package:permission_handler/permission_handler.dart'; // 通常需要配合permission_handler来处理权限

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter User-Centric Location Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('User-Centric Location Demo'),
        ),
        body: Center(
          child: UserLocationScreen(),
        ),
      ),
    );
  }
}

class UserLocationScreen extends StatefulWidget {
  @override
  _UserLocationScreenState createState() => _UserLocationScreenState();
}

class _UserLocationScreenState extends State<UserLocationScreen> {
  late Position _currentPosition;
  bool _isLocating = false;

  @override
  void initState() {
    super.initState();
    _getCurrentLocation();
  }

  Future<void> _getCurrentLocation() async {
    setState(() {
      _isLocating = true;
    });

    // 请求位置权限
    var status = await Permission.location.status;
    if (!status.isGranted) {
      var result = await Permission.location.request();
      if (!result.isGranted) {
        // 用户拒绝权限请求
        setState(() {
          _isLocating = false;
        });
        return;
      }
    }

    // 使用flutter_finder_usercentric获取位置(假设其提供了getLocation方法)
    try {
      _currentPosition = await FlutterFinderUsercentric.getLocation();
    } catch (e) {
      print("Error getting location: $e");
      setState(() {
        _isLocating = false;
      });
      return;
    }

    setState(() {
      _isLocating = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        if (_isLocating)
          CircularProgressIndicator()
        else
          Text(
            'Latitude: ${_currentPosition.latitude}, Longitude: ${_currentPosition.longitude}',
            style: TextStyle(fontSize: 20),
          ),
      ],
    );
  }
}

注意

  • 在实际使用中,FlutterFinderUsercentric.getLocation()方法可能需要根据实际插件的API进行调整。
  • permission_handler插件用于处理Android和iOS上的权限请求。如果你使用的flutter_finder_usercentric插件自带权限处理功能,则可能不需要permission_handler
  • 由于flutter_finder_usercentric并非一个广为人知的插件,上述代码是基于假设其功能类似于其他位置插件而编写的。如果实际插件的API有所不同,请参考其官方文档进行相应调整。

希望这能帮助你在Flutter项目中实现用户中心定位功能!

回到顶部