我是 tdd 的初学者,所以如果这是一个愚蠢的问题,请原谅我。
我在单元测试 GetxControllers 时遇到困难。有谁知道这样做的简单方法?每当我这样做时,我都会收到错误,因为 Get 正在调用 onStart 并且它不喜欢 Mockito 给出的结果。我尝试使用 Mockito 5.0.1 的自动生成代码以及旧语法,类 MockController 扩展 Mock 实现 Controller{},以及扩展 Fake。
自动生成的代码有构建错误,因为 Mockito 试图使用 _InternalFinalCallback,但它没有被导入,因为它是私有的。我尝试将那部分代码复制粘贴到我生成的文件中(并关闭 pub build watch)但首先这是一个短期解决方案,它有自己的问题,第二它仍然不起作用,因为 onStart 和 onDelete 函数现在告诉我它们不是有效的覆盖。
另外,我可以看到 get_test 包,但它的文档基本上是 0,在示例中,控制器只是直接使用——从来没有模拟控制器。
我尝试设置 Get.testMode = true; 但同样,这似乎没有任何作用。虽然我在文档中找到了该属性,但我没有找到如何正确使用它。
任何帮助,将不胜感激,
这是我的代码,但问题似乎出在 GetxControllers 上,所以我认为它没有太大关系:
class FakeAuthController extends Fake implements AuthController {}
@GenerateMocks([AuthController])
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
late MockAuthController mockAuthController;
late FakeAuthController fakeAuthController;
late SessionController sessionController;
setUp(() {
Get.testMode = true;
mockAuthController = MockAuthController();
fakeAuthController = FakeAuthController();
Get.put<AuthController>(mockAuthController);
sessionController = …
Run Code Online (Sandbox Code Playgroud) 我正在将我的应用程序重构为 GetX 状态管理,以减少样板代码。 我制作了控制器和 API 提供者(下面的代码)。但是当我想刷新数据时(也是手动)它不会改变。
主页.dart
class HomeUI extends GetView<HomeController> {
...
GetX<HomeController>(
initState: (state) => Get.find<HomeController>().getAll(),
builder: (_) {
return _.goalList.length < 1 ||
_.goalList == null
? Center(
child: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
CircularProgressIndicator(),
Text('0 goals found, please wait',
style: Theme.of(context)
.textTheme
.headline6
.copyWith(
color: kTextColor))
],
))
: ListView.builder(
itemBuilder: (context, index) {
GoalModel goalModel =
GoalModel.fromMap(
_.goalList[index]);
return ListTile(
title: Text(goalModel.text),
subtitle:
Text(goalModel.updated_at),
);
});
}
Run Code Online (Sandbox Code Playgroud)
home_controller.dart
class HomeUI extends GetView<HomeController> {
...
class …
Run Code Online (Sandbox Code Playgroud) 我正在寻找如何在 GetX 的最佳实践中处理表单和验证的示例?有没有很好的例子,或者有人可以向我展示我们如何最好地做到这一点的例子?
我有这个全局绑定类来初始化一些服务,我需要立即初始化它:
import 'package:get/get.dart';
import 'package:vepo/data/data_provider/local_data_provider.dart';
import 'package:vepo/data/data_source/local_data_source.dart';
import 'services/authentication_service.dart';
class GlobalBindings extends Bindings {
final LocalDataProvider _localDataProvider = LocalDataProvider();
@override
void dependencies() {
Get.put<AuthenticationService>(AuthenticationService(), permanent: true);
Get.put<LocalDataProvider>(_localDataProvider, permanent: true);
Get.put<LocalDataSource>(LocalDataSource(_localDataProvider),
permanent: true);
}
}
Run Code Online (Sandbox Code Playgroud)
这是在我的初始绑定中:
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'Vepo',
initialRoute: AppPages.INITIAL,
initialBinding: GlobalBindings(),
transitionDuration: const Duration(milliseconds: 500),
defaultTransition: Transition.rightToLeft,
getPages: AppPages.routes,
home: Root(),
theme: homeTheme,
);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在类构造函数中,我尝试“找到”它:
class UserLocalRepository extends VpService implements IUserLocalRepository {
UserLocalRepository() {
localDataSource = …
Run Code Online (Sandbox Code Playgroud) 我使用 getx 作为我的 flutter 应用程序的状态管理。但是我在更新列表中的值时遇到了困难。所以我有一个参数为 isFollowing 的用户模型。当我点击一个按钮时,isFollowing 变量会改变,颜色也会更新。但它并没有发生。我使用 Obx 作为我的小部件,因为我已经在开始时注入了状态。获取数据并在前端显示它一切正常。但是当我想更改列表中的值时,它没有更新。我的最小可重复示例
家庭控制器
class HomeController extends GetxController {
var userslist = List<User>().obs;
@override
void onInit() {
fetchUsers();
super.onInit();
}
void fetchUsers() async {
var users= await ApiService().getapidata('${usersurl}feed');
if (users!= null) {
userslist.value= users;
}
}
}
Run Code Online (Sandbox Code Playgroud)
模型
class User {
User({
this.id,
this.user_name,
this.profile_picture,
this.isFollowing,
});
int id;
String user_name;
String profile_picture;
bool isFollowing;
factory User.fromJson(Map<String, dynamic> json) => User(
id: json["id"],
user_name: json["user_name"],
profile_picture: json["profile_picture"],
isFollowing: json["is_following"],
);
Run Code Online (Sandbox Code Playgroud)
看法
class HomeScreen …
Run Code Online (Sandbox Code Playgroud) 我是 flutter 和 GetX 包世界的新手,我正在尝试使用 Laravel 作为我的 API 服务创建一个简单的应用程序,我正在以 JSON 格式发送来自 API 的响应,我正在使用 Laravel 资源 API,因此它正在发送响应中有一些额外的元数据,我已经在我的 flutter 应用程序中创建了服务模型和控制器,但是当我在控制器中初始化一个可观察变量时,它抛出了很多错误,我尝试了所有方法,但在我发送时它工作正常只有来自 API 的数据列表,因为我必须List<Model>.obs
在控制器中定义,但是当我根据需要从 API 发送正确的响应时,问题就发生了。
这是我来自 API 的 JSON 响应数据
{
"data": [
{
"id": 1,
"description": "Purchased mouse",
"amount": "1200",
"type": "expense",
"user_id": 1,
"created_at": null,
"updated_at": null
},
{
"id": 2,
"description": "Purchased mouse sa",
"amount": "1200",
"type": "expense",
"user_id": 1,
"created_at": null,
"updated_at": null
},
{
"id": 3,
"description": "Purchased mouse",
"amount": "1200",
"type": "expense",
"user_id": 1,
"created_at": …
Run Code Online (Sandbox Code Playgroud) 我正在List of Cards
根据toDoId的数量创建。
toDoController.toDo() 就像
toDo = [q1, r4, g4, d4].obs;
Run Code Online (Sandbox Code Playgroud)
而且,这是我的 ListView.builder()
Obx(() {
List _todo = toDoController.toDo();
return ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
itemCount: _todo.length,
itemBuilder: (BuildContext context, int i) {
var _loading = true;
var _title = 'loading';
getTodoInfo() async {
_title = await toDoController
.getTodoInfo(
_todo[i]
);
_loading = false;
print(_title); // 'Clean!' <--- returns correct title
}
getTodoInfo();
return Container(
height: 150,
width: 150,
child: _loading
? Text(
_title,
)
: Text(
_title, …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,它有一个五页的底部导航栏。我使用 getx。在第一页,我列出了数据。我的问题是,当我从数据库手动更改数据(底部导航栏中的第一页)然后我越过页面时,回到第一页我看不到更改。
控制器;
class ExploreController extends GetxController {
var isLoading = true.obs;
var articleList = List<ExploreModel>().obs;
@override
void onInit() {
fetchArticles();
super.onInit();
}
void fetchArticles() async {
try {
isLoading(true);
var articles = await ApiService.fetchArticles();
if (articles != null) {
//articleList.clear();
articleList.assignAll(articles);
}
} finally {
isLoading(false);
}
update();
}
}
Run Code Online (Sandbox Code Playgroud)
和我的用户界面;
body: SafeArea(
child: Column(
children: <Widget>[
Header(),
Expanded(
child: GetX<ExploreController>(builder: (exploreController) {
if (exploreController.isLoading.value) {
return Center(
child: SpinKitChasingDots(
color: Colors.deepPurple[600], size: 40),
);
}
return ListView.separated(
padding: …
Run Code Online (Sandbox Code Playgroud) 我正在学习 GetX 状态管理并偶然发现 DropdownButton 小部件。无法观察到如何使用所选值更新所选值。这是我的 DropdownButton 小部件
DropdownButton(
hint: Text(
'Book Type',
),
onChanged: (newValue) {
print(newValue);
},
value: selectedType,
items: bookController.listType.map((selectedType) {
return DropdownMenuItem(
child: new Text(
selectedType,
),
value: selectedType,
);
}).toList(),
),
Run Code Online (Sandbox Code Playgroud)
这
var selectedType;
Run Code Online (Sandbox Code Playgroud)
在小部件构建中声明。我试图使这个变量可观察,但布局会引发溢出错误。我也用 obx 包装了小部件,但它仍然抛出相同的错误。这个小部件是如何使用 GetX 实现的。我在这里拉头发。我可以使用 getX 处理其他小部件。
我有一个简单的 Flutter 应用程序,我想删除所有以前的路由,但我想使用 GetX,该怎么做?
现在它与
Navigator.of(context).pushNamedAndRemoveUntil('/home', (Route<dynamic> route) => false);
Run Code Online (Sandbox Code Playgroud)
但我想知道正确的方法Get.to
或类似的
我创建了一个 flutter 应用程序并使用了 getx 包。但是后来我用它来显示小吃店,该功能被执行但小吃店没有出现。
onPressed: () {
print("executed");
Get.snackbar(
"title",
"content",
);
},
Run Code Online (Sandbox Code Playgroud) 当我Getx
用来更新我的 Widget 时?我不知道Rx()
如何联系我放入的东西。
代码是_obx=Rx()
. 但我发送的数据是"".obs
. 那不是,Rx()
但这是RxString()
。当我使用"".obs.value="newString"
. 为什么Rx()
可以知道谁更新数据。
就像 :
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class GetIncrementPage extends StatefulWidget {
GetIncrementPage({Key key}) : super(key: key);
@override
_GetIncrementPageState createState() => _GetIncrementPageState();
}
class _GetIncrementPageState extends State<GetIncrementPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('get'),
),
body: Container(
alignment: Alignment.center,
child: _body(),
),
);
}
Widget _body() {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, …
Run Code Online (Sandbox Code Playgroud) 到目前为止,下面的代码工作正常,
class Controller extends GetxController{
var count = 0.obs;
increment() => count++;
}
Run Code Online (Sandbox Code Playgroud)
但是当我分配一个值时,它不能按预期工作,而不是类型转换的事件。
class Controller extends GetxController{
var count = 0.obs;
reset() => count = 10;
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何在 get x obs 对象中分配值(使用 '=' )?
flutter ×13
getx ×13
dart ×7
flutter-getx ×4
bloc ×1
controller ×1
flutter-get ×1
forms ×1
json ×1
unit-testing ×1
validation ×1