Я хочу вызвать значение строки в моем контроллере, вот мой контроллер:
class SplashScreenController extends GetxController {
late String one = _setImage();
@override
void onInit() {
_initPackageInfo();
_setImage();
Timer(Duration(seconds: 5), () => Get.offNamed(Routes.DASHBOARD));
super.onInit();
}
@override
void onClose() {}
PackageInfo _packageInfo = PackageInfo(
appName: 'Unknown',
packageName: 'Unknown',
version: 'Unknown',
buildNumber: 'Unknown',
buildSignature: 'Unknown',
);
Future<void> _initPackageInfo() async {
_packageInfo = await PackageInfo.fromPlatform();
}
String _setImage() {
print(_packageInfo.packageName);
///main package
if (_packageInfo.appName == 'x1') {
return Images.x1;
} else if (_packageInfo.packageName == 'com.package.package1') {
return Images.package1;
} else {
return Images.x1;
}
}
}
Я хочу вызвать функцию setImage()
в своем виджете, но после вызова возникает проблема, вы можете увидеть ее здесь:
[Get] обнаружено ненадлежащее использование GetX. Вы должны использовать GetX или Obx только для конкретного виджета, который будет обновлен. Если вы видите эту ошибку, возможно, вы не вставили какие-либо наблюдаемые переменные в GetX/Obx. или вставьте их за пределы области, которую GetX считает подходящей для обновления (пример: GetX => HeavyWidget => variableObservable). Если вам нужно обновить родительский виджет и дочерний виджет, оберните каждый из них в Obx/GetX.
А вот вид, где я вызываю функцию контроллера:
Widget build(BuildContext context) {
return Obx(() => Scaffold(
body: Container(
color: const Color.fromARGB(255, 255, 255, 255),
alignment: AlignmentDirectional.center,
child: Image.asset(controller.one)),
));
}
Есть ли способ исправить это, чтобы я мог получить доступ к _setImage()
в моем представлении?
Я знал это, я использовал flutter_bloc раньше, но я помогаю нескольким проектам, используя GetX, и эта проблема проявляется
У вас есть эта ошибка, потому что вы оборачиваете свой код в Obx, но не используете наблюдаемую переменную внутри.
Измените свой код следующим образом:
class SplashScreenController extends GetxController {
late String one = ''.obs; // This is the observable variable that you need
@override
void onInit() {
_initPackageInfo();
_setImage();
Timer(Duration(seconds: 5), () => Get.offNamed(Routes.DASHBOARD));
super.onInit();
}
@override
void onClose() {}
PackageInfo _packageInfo = PackageInfo(
appName: 'Unknown',
packageName: 'Unknown',
version: 'Unknown',
buildNumber: 'Unknown',
buildSignature: 'Unknown',
);
Future<void> _initPackageInfo() async {
_packageInfo = await PackageInfo.fromPlatform();
}
void _setImage() {
print(_packageInfo.packageName);
///main package
if (_packageInfo.appName == 'x1') {
one = Images.x1;
} else if (_packageInfo.packageName == 'com.package.package1') {
one = Images.package1;
} else {
one = Images.x1;
}
}
}
И для виджета:
Widget build(BuildContext context) {
return Obx(() => Scaffold(
body: Container(
color: const Color.fromARGB(255, 255, 255, 255),
alignment: AlignmentDirectional.center,
child: controller.one.isNotEmpty
? Image.asset(controller.one))
: const SizedBox.shrink(),
));
}
Вызывает ли он мою функцию _setImage()?
Вы уже вызываете свою функцию _setImage() внутри onInit в вашем контроллере.
хорошо, но _setImage() уже вызывается внутри Image.asset()? потому что я хочу получить строковое значение _setImage()
Вам больше не нужно вызывать _setImage() в Image.asset, потому что вы уже вызвали его в onInit вашего контроллера. Результат функции уже хранится в одной переменной obs, поэтому обычно вы получаете правильный результат.
Друзья, не позволяйте друзьям использовать GetX! Если вы участвуете в флаттер-дискорде, введите ?getx. В противном случае, это семиминутное видео описывает хорошее подробное описание «почему бы и не getx»: youtu.be/zlIgy4es5Ts