在进行 Flutter 小部件测试时,WidgetTester如果我了解树中至少一个小部件,我可以从中获取上下文。Text例如,如果我知道测试小部件树中有一个小部件,我可以
BuildContext context = tester.element(find.byType(Text));
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得更普遍的背景?例如,我可以获取树的根小部件并获取它的BuildContext吗?
我准备用 Flutter 和 Provider 编写我的第一个重要应用程序。我已经阅读了 Provider 如何促进不可变小部件(StatelessWidgets)。我的问题是,在使用 Provider 时使用 StatefulWidgets总是一种反模式吗?如果不是,那么在 Provider 应用程序中最好使用 StatefulWidgets 的例子有哪些?
编辑
使用 Provider 已经几个月了,在任何情况下我仍然喜欢它而不是 StatefulWidgets。我时不时地引入一个StatefulWidget,主要是为了尝试熟悉它们,几乎立即后悔并重构为Provider。前几天我遇到了不刷新的小部件,因为它们是相同的类型,所以正在考虑引入键以便它们刷新。前几次尝试失败了,所以我重构为 Provider 并且一切正常(不需要密钥)。
反模式在我的 OP 中不是正确的术语。我想我的问题是,有没有 StatefulWidgets 更干净或更容易/更好用的例子?
我正在阅读JavaScript IIFE和迄今为止的理解概念,但我想知道外部括号.具体来说,他们为什么需要?例如,
(function() {var msg='I love JavaScript'; console.log(msg);}());
Run Code Online (Sandbox Code Playgroud)
效果很好,但是
function() {var msg='I love JavaScript'; console.log(msg);}();
Run Code Online (Sandbox Code Playgroud)
生成语法错误.为什么?关于IIFE的讨论很多,但我没有看到为什么需要括号的明确解释.
我的集成测试正在使用 flutter_driver,但在按照文档迁移到integration_test之后,我无法通过启动屏幕。
\n下面是一个简单的测试。如果不使用,sleep我永远不会越过Test starting...屏幕,正如其他人在这里发现的那样。随着sleep测试通过Test starting...,但随后卡在了我的启动屏幕上。不确定是否相关,但我的身份验证屏幕位于启动屏幕之后。
import \'dart:io\';\nimport \'package:flutter/widgets.dart\';\nimport \'package:flutter_test/flutter_test.dart\';\nimport \'package:integration_test/integration_test.dart\';\nimport \'../lib/main.dart\' as app;\n\nvoid main() {\n IntegrationTestWidgetsFlutterBinding.ensureInitialized();\n\n testWidgets(\'verify users\', (WidgetTester tester) async {\n app.main();\n\n sleep(const Duration(seconds: 10));\n\n await tester.pumpAndSettle();\n\n final Finder menuButtonFinder = find.byKey(const Key(\'kKeyButtonMenu\'));\n\n expect(menuButtonFinder, findsOneWidget);\n });\n}\nRun Code Online (Sandbox Code Playgroud)\n下面是显示失败的输出
\nPS C:\\projects\\dream_app> flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart \nRunning "flutter pub get" in dream_app... 1,128ms\nRunning Gradle task \'assembleDebug\'...\nRunning Gradle task \'assembleDebug\'... Done 29.9s\n\xe2\x88\x9a Built build\\app\\outputs\\flutter-apk\\app-debug.apk.\nInstalling build\\app\\outputs\\flutter-apk\\app.apk... 861ms\nD/EGL_emulation(16572): eglMakeCurrent: …Run Code Online (Sandbox Code Playgroud) 在 Win64 上运行 Python 3.3,我在这里找到了如何在 IDLE 3.3 中添加断点,但是当我通过运行 > 运行模块(F5)运行我的模块时,它直接通过了我的断点。我错过了什么?
我看到大多数Doxygen文档用于评论c ++函数,看起来类似于
/// a description of the function or method followed with comments, like so
/// @return true=success, false=error
/// @param[in] bar blah blah
/// @param[out] baz blah blah
/// @param[out] quux blah blah
/// @param[out] quuux blah blah
/// @param[out] quuuux blah blah
static bool foo_one( int *bar, int *baz, int *quux, int *quuux, int *quuuux );
Run Code Online (Sandbox Code Playgroud)
或xml等价物(粗略)
/// a description of the function or method, followed by
/// <returns>true=success, false=error</returns>
/// <param name=bar>blah blah</param>
/// <param name=baz>blah blah</param> …Run Code Online (Sandbox Code Playgroud) 我在几个地方读到扩展 Flutter 小部件是一种反模式。真的吗?
我已经使用小部件子类化通过子类化我要删除的小部件并将其小部件放在其构造函数中来减少嵌套,就像这样
class Foo extends FormBuilder {
Foo() : super (
// bunch of widgets here
);
}
Run Code Online (Sandbox Code Playgroud)
扩展无状态小部件似乎更受欢迎,但它向树中添加了更多代码行和小部件,这不是我的偏好:
class Foo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FormBuilder(
// bunch of widgets here
);
}
Run Code Online (Sandbox Code Playgroud)
我读过从函数返回小部件是一种反模式,因为它破坏了渲染优化。我的第一种方法是否也有隐藏的副作用?即,它真的是一个反模式吗?
约定是字母“I”开头的纯虚拟接口类。通常,我发现我还需要一个具有子类共享功能的部分具体类。所以,
class IFoo {...}
class Foo : public IFoo {...}
Run Code Online (Sandbox Code Playgroud)
当我希望从 Foo 派生的子类通过名称空间进行区分时,我遇到了命名难题。例如,
Bar::Foo
Baz::Foo
Run Code Online (Sandbox Code Playgroud)
因为当我编码时
namespace Bar { class Foo : public Foo {} }
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,VS 给出错误“一个类不能是它自己的基类”。(当没有“中间类时,这不是问题,因为命名是 Bar::IFoo 和 Baz::IFoo。)我可以通过以下方式解决这个问题
class MyFoo : public IFoo
namespace Bar { class Foo : public MyFoo {} }
Run Code Online (Sandbox Code Playgroud)
或者
namespace base { class Foo : public IFoo {} }
namespace Bar { class Foo : public base::Foo {} }
Run Code Online (Sandbox Code Playgroud)
但不希望命名混乱。
我知道拥有 Foo、Bar::Foo 和 Baz::Foo 类是不好的,因为明显的混乱。(例如,添加“using Bas;”会引起歧义。)是否有一个命名约定或语法可以清楚地关联我想要做的事情?
我的 Flutter 应用程序的主题在 TextFields 周围添加边框:
ThemeData(
...
inputDecorationTheme: InputDecorationTheme(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(width: 1.0),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(width: 1.0),
),
)
Run Code Online (Sandbox Code Playgroud)
但是,我确实有一个不需要边框的 TextField,因此我尝试覆盖 TextField 中的边框:
TextField(
decoration: InputDecoration.collapsed(
hintText: _hintText,
border: InputBorder.none,
),
controller: _textController,
),
Run Code Online (Sandbox Code Playgroud)
但我仍然得到边界?下面是部分图像。“请输入!” 字段使用主题默认值,“问题”字段是我试图覆盖的字段。
我第一次使用 SegmentedButton,当我使用 SizedBox 将其高度减小到 25 时,我很惊讶它没有使文本居中:
这是我的代码。如何将高度降低到 25 并保持文本垂直居中?
enum GoalButtons { todo, done }
class ToDoAndDoneRadioButtons extends StatefulWidget {
const ToDoAndDoneRadioButtons({
super.key,
});
@override
State<ToDoAndDoneRadioButtons> createState() => _GoalRadioButtonsState();
}
class _GoalRadioButtonsState extends State<ToDoAndDoneRadioButtons> {
GoalButtons goalsView = GoalButtons.todo;
@override
Widget build(BuildContext context) {
return SizedBox(
height: 25.0,
width: 300,
child: GetBuilder<SwitchController>(
builder: (switchController) => MouseRegion(
child: SegmentedButton<GoalButtons>(
style: ButtonStyles.calendarToggles,
showSelectedIcon: false,
segments: const <ButtonSegment<GoalButtons>>[
ButtonSegment<GoalButtons>(
value: GoalButtons.todo,
label: Text('TO-DO'),
),
ButtonSegment<GoalButtons>(
value: GoalButtons.done,
label: Text('DONE'),
),
],
selected: <GoalButtons>{goalsView}, …Run Code Online (Sandbox Code Playgroud) flutter ×5
c++ ×2
breakpoints ×1
doxygen ×1
flutter-test ×1
iife ×1
javascript ×1
namespaces ×1
provider ×1
python-3.x ×1
python-idle ×1
subclass ×1
textfield ×1