как использовать переменную в другом файле flutter?
На странице В, в классе В есть следующий код -
class B extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: Center(
child: Column(
children: [
ElevatedButton(
onPressed: () async {
var result = '';
var url = "http://10.0.101.141:6113/api/Cashier/authenticate";
final response = await http.post(
Uri.parse(url),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{
'login': _textEditingController.text,
'password': _passEditingController.text
}),
);
if(response.statusCode == 200) {
result = jsonEncode(response.body); //ВОТ ЭТУ ПЕРЕМЕННУЮ МНЕ НУЖНО КАК ТО ПЕРЕТАЩИТЬ В ФАЙЛ "A"
print(result);
Navigator.pushNamed(context, '/home');
} else {
print('err');
}
//
// print(_textEditingController.text);
// print(_passEditingController.text);
},
child: Text('sdfsdfs'))
],
),
),
)
}
}
Мне нужно использовать переменную result в Файле A, с классом А -
class A extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: Center(
child: Column(
children: [
ElevatedButton(
onPressed: () async {
var sum = int.parse(text);
const url = "http://10.0.101.141:6113/api/transaction/createtransaction";
final token = ''; //ВОТ ТУТ МНЕ НУЖНО ИСПОЛЬЗОВАТЬ
try {
final response = await http.post (
Uri.parse(url),
headers: <String, String>{
"Content-Type": "application/json; charset=UTF-8",
"Authorization": 'Bearer $token'
},
body: jsonEncode(<String, int> {
'amount': sum
})
);
if (response.statusCode == 200) {
Navigator.push(context, new MaterialPageRoute(builder: (context) => new Qr()));
var res = await response.body;
print(res);
} else{
var res = response.statusCode;
print(res);
}
} catch (error) {
print(error);
}
},
child: Text('sdfsdfs'))
],
),
),
)
}
}
Подскажите, пожалуйста, как я могу это сделать? Я попытался предоставить всю необходимую информацию, извините, если много лишнего кода, я только что набросал эту не большую конструкцию, но она передает смысл проблемы
Любой помощи буду рад!
Ответы (1 шт):
Профессиональным решением этой и других сопутствующих проблем является продуманная архитектура приложения. Используйте архитектурные паттерны. Когда мне дали разработку мобильного приложения на flutter, то был выбран шаблон MVVM (Model-View-ViewModel). Логика следующая:
- Есть
Model, отвечает за то, как выглядят данные, то есть, если работаете с пользователями, создаете класс UserModel и там храните его поля и т.д. - Есть
View, он отвечает за отображение, это и есть ваши экраны, где отрисовываются элементы. - И связывает их объект
ViewModel, в котором хранится логика. В этом классе должны реализовываться все функции, отвечающие за логику. Туда как раз и вынесете события нажатия кнопок и отправки запроса. И тут же будут складываться данные результата запроса и т.п. Если на экране должен отображаться список чего-то, то список моделей должен лежать внутри ViewModel и из него экран должен этот список получать, чтобы отрисовать. Можете создать один объект ViewModel и передать его двум экранам в конструкторе, таким образом ViewModel сохранит данные и любой экран сможет их прочитать.
В реализации помогла библиотека stacked.
Вот так выглядит создание MaterialApp:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
// позволяем приложению только портретную ориентацию экрана
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
return ViewModelBuilder<AppLanguageViewModel>.reactive(
viewModelBuilder: () => locator<AppLanguageViewModel>(),
builder: (context, AppLanguageViewModel viewModel, _) => MaterialApp(
navigatorKey: navigatorKey,
initialRoute: Routes.loading,
routes: {
Routes.loading: (context) => LoadingScreen(languageViewModel: viewModel),
Routes.auth: (context) => AuthScreen(languageViewModel: viewModel),
Routes.main: (context) => MainScreen(languageViewModel: viewModel),
Routes.schedule: (context) => ScheduleScreen(),
Routes.notification: (context) => NotificationScreen(),
},
),
);
}
}
Здесь locator - это глобальная переменная: final locator = GetIt.instance;. Объект GetIt из библиотеки get_it. Он помогает регистрировать singleton объекты. Вот пример:
final locator = GetIt.instance;
Future<void> setupLocator() async {
// Здесь регистрируем синглтоны
// Сервисы
locator.registerSingleton(new LocalStorageService());
locator.registerSingleton(new TokenService());
locator.registerSingleton(new AppLanguageService());
// Глобальные ViewModel
locator.registerSingleton<AppLanguageViewModel>(new AppLanguageViewModel());
// Для утилит
locator.registerLazySingleton(() => new Random());
}
Далее, во входной функции main() нужно вызвать функцию настройки locator'а до запуска приложения:
// locator - объект, который помогает манипулировать синглтонами
await setupLocator();
runApp(MyApp());
Здесь в строчке ViewModelBuilder<AppLanguageViewModel>.reactive создаётся AppLanguageViewModel, который отвечает за функционал переключения языка приложения и он передаётся в конструкторы экранов, где он должен использоваться. Далее уже вызывайте необходимые функции и используйте требующиеся данные, работая с одним экземпляром ViewModel на разных экранах.
Пример того как используется ViewModel на экране:
MainSwitchLanguageButtonView(
onChangeLanguage: (key) =>
languageViewModel.setLanguageByKey(key),
currentLanguage: languageViewModel.current)