我在我的应用程序中使用 getx 包,但我想知道一些事情。是否可以使用 getx 重置我的应用程序的所有状态?所以这有点像重新启动。
我尝试将 GetX Builder 与控制器中的 bool 结合使用,在获取数据时显示加载旋转器,然后再显示数据。
将更新打印到 bool 显示它已完成加载并更改变量,但 UI 永远不会更新以反映这一点。
控制器
class AuthController extends GetxController {
//final RxBool isLoading = true.obs;
//var isLoading = true.obs;
final Rx<bool> isLoading = Rx<bool>(true);
setLoading(bool status) {
isLoading.value = status;
print(isLoading.value);
update();
}
fetchUserData() async {
setLoading(true);
_firebaseUser.bindStream(_auth.authStateChanges());
if (_auth.currentUser != null) {
bool profileRetrieved =
await FirestoreDB().getUserProfile(_auth.currentUser!.uid).then((_) {
return true;
});
setLoading(!profileRetrieved);
}
}
}
Run Code Online (Sandbox Code Playgroud)
个人资料页
class ProfileCard extends StatelessWidget {
const ProfileCard({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) { …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种最佳实践方法来实现在显示第一页之前等待我的应用程序初始化数据。
该应用程序有一个主控制器以及每页一个控制器。主控制器最初从服务器加载数据,在完成之前我想显示一个启动页面(或者至少在打开实际的应用程序页面之前等待)
一个简单的解决方案是,页面等待主控制器初始化
class MainController extends GetxController {
final isInitialized = false.obs;
@override
void onInit() async {
Future f1 = server.get('service1').then(....)
Future f2 = server.get('service1').then(....)
Future f3 = server.get('service1').then(....)
await Future.wait([f1, f2, f3]);
isInitialized.value = true;
}
}
Run Code Online (Sandbox Code Playgroud)
页面组件可以:
class HandleTaskPage extends GetView<HandleTaskPageController> {
@override
Widget build(BuildContext context) {
MainController mainController = Get.find();
return Obx(() {
if (mainController.isInitialized().value) {
return TaskPanelWidget();
} else {
return WaitingPage();
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
但我的应用程序允许用户使用直接 URL(网络应用程序)在任何给定页面启动,例如http://app.com/showtask/123 这意味着我必须在每个页面上等待全局控制器。
有什么方法可以让 Get 等待(并可能显示欢迎页面),直到 GlobalController 准备好,然后再转到路线中描述的页面?
我尝试向 …
我在 GetX 中制作了两个非常简单的页面来学习它。我为它创建了三个变量,一个是柜台,另一个是目的地和出发城市。计数器变量正在完美更新,而其他变量没有更改其值。它们仅在我热重载时才会改变。
如果您认为我错过了某些内容或者这种疑问很常见,并且您看过像我这样的非常相似的示例,请分享它的链接或如果可以的话更正代码。
这是我的课程:
import 'package:get/get.dart';
class Controller extends GetxController {
var count = 0.obs;
var des = "Delhi".obs;
var dep = "Agra".obs;
void increment() {
count.value++;
update();
}
void updateDes(String input) {
des = input.obs;
}
void updateDep(String input) {
dep = input.obs;
}
}
Run Code Online (Sandbox Code Playgroud)
这是第一页(您可以查看第 14、30-52 行)-
import 'package:flutter/material.dart';
import 'package:flutter_application_firebase_noti_basics/my_controller.dart';
import 'package:flutter_application_firebase_noti_basics/new_home.dart';
import 'package:get/get.dart';
class Sample extends StatefulWidget {
const Sample({Key? key}) : super(key: key);
@override
_SampleState createState() => _SampleState();
}
class _SampleState extends State<Sample> { …Run Code Online (Sandbox Code Playgroud) 我正在使用获取包。
这是我的代码的样子,
class MyController extends GetXController{
//code to fetch data from firebase
}
class SecondScreen extends GetView<MyController>{
@override
Widget build(BuildContext context) {
return GetBuilder(
init: MyController(),
builder: (controller) {
return Scaffold(
//code...
);
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
疑问:
我有一个按钮,使用它导航到secondScreenfrom homePage,每次我点击该按钮时,控制器MyController都会再次初始化,如此反复data is fetched。但我想做一些事情,将第一次初始化的控制器永久保留在内存中。我怎样才能做到这一点?
我知道,我们可以做这样的事情,
Get.put(Controller(), permanent: true);
但是,在我的代码中,我没有在任何地方使用 Get.put 方法,因为当调用扩展 GetView 的类时,控制器会自动初始化。
我正在创建一个待办事项列表(某种)应用程序。我有一个使用 FutureBuilder 的视图,它调用一个函数从 SQLite 数据库中获取文章并显示为卡片。我有一个getx_controller.dart,其中包含可观察的列表:
class Controller extends GetxController {
// this is the list of items
var itemsList = <Item>[].obs;
}
Run Code Online (Sandbox Code Playgroud)
我有一个items_controller.dart
// function to delete an item based on item id
void deleteItem(id) {
final databaseHelper = DatabaseHelper();
// remove item at item.id position
databaseHelper.deleteItem(tableItems, id);
print('delete item with id $id');
this.loadAllItems();
}
Run Code Online (Sandbox Code Playgroud)
loadAllItems是查询数据库的函数
最后,list_builder.dart包含 FutureBuilder
final itemController = Get.put(ItemsController());
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Item>>(
future: itemController.loadAllItems(),
builder: (context, …Run Code Online (Sandbox Code Playgroud) 我的 Flutter 桌面 Web 应用程序具有复杂的用户界面,很难做出响应。因此,我想将其放在一个FittedBox如果用户缩小浏览器窗口时会简单地缩小整个应用程序的应用程序中。
class CustomPage extends StatelessWidget {
final Widget child;
const CustomPage({
Key? key,
required this.child,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: GetPlatform.isDesktop
? FittedBox(
child: SizedBox(
width: Get.width,
height: Get.height,
child: Center(child: child),
),
)
: Text('Sorry! This was only meant for desktop.'),
);
}
}
Run Code Online (Sandbox Code Playgroud)
但是Get.width并且WidgetsBinding.instance.window.physicalSize.width只能得到初始窗口大小。因此,如果应用程序在全屏浏览器中启动,则效果很好,但如果应用程序在小浏览器中启动,则不起作用。MediaQuery.of(context).size.width只获取当前屏幕尺寸。
有没有办法获取桌面物理屏幕尺寸?
在 GetX 状态管理的帮助下,我已将 Firebase Cloud Messaging 集成到我的 Flutter 移动应用中。我还使用 Laravel 和 Firebase Admin SDK 向我的应用程序发送通知。
\n该通知在前台状态和后台状态(已暂停)下都运行良好。当我单击应用程序处于终止状态(应用程序关闭)的通知时,问题就开始了。我是否必须在启动画面和主页之间设置延迟?
\n我已经尝试这样做但仍然出现错误
\n//open notif content from terminated state of the app\nFirebaseMessaging.instance.getInitialMessage().then((message) {\n if (message != null) {\n print('TERMINATED');\n if (FirebaseAuth.instance.currentUser != null) {\n final redirectRoute = message.data['route'];\n if (redirectRoute != null) { \n //adding delay here since my splashscreen have the same delay \n Future.delayed(const Duration(seconds: 6));\n bottomnavbarController.updateIndex(int.parse(redirectRoute));\n }\n } else {\n Get.offAllNamed(Routes.LOGIN);\n }\n }\n});\nRun Code Online (Sandbox Code Playgroud)\n我收到这个错误
\nUnhandled Exception: \nYou are …Run Code Online (Sandbox Code Playgroud) 我正在构建一个 flutter 应用程序,我想在我的项目中使用有状态的小部件,并希望使用getx库进行状态管理。我想知道是否会有表演
如果文本是这样的:
Text(
'Put something ${widget.profileA} might like'.tr,
),
Run Code Online (Sandbox Code Playgroud)
这是翻译示例的代码:
class Language extends Translations {
@override
Map<String, Map<String, String>> get keys => {
'en_US': {
'Put something ${widget.profileA} might like': 'some translation',
};
};
}
Run Code Online (Sandbox Code Playgroud)
${widget.profileA}我的问题是,既然文本中有一个参数,有没有一个好的解决方案可以用这个参数翻译整个句子?谢谢你!