#json #flutter #variables #sqflite
#json #flutter #переменные #sqflite
Вопрос:
Я очень новичок в программировании, и я пытаюсь передать переменную (jsonData) из будущего в другое будущее в другом классе, чтобы данные из переменной можно было сохранить в базе данных. Не смущайтесь, я использую API для получения необходимых данных, это работает отлично. Любые советы, как я могу получить доступ к переменной jsonData для вставки данных?
//first class gets the json data
class getJSONData {
Future<void> makeRequest() async {
var url = "some url";
Map inputData = {
"Password": example,
"SQL": sql query,
"db_server": "server",
"db_table": "table",
};
var body = json.encode(inputData);
var putRequest = await http.put(
Uri.encodeFull(url), headers: {"Content-Type": "application/json"},
body: body);
//this variable has to be stored
var jsonData = json.decode(putRequest.body);
}
}
//data needs to be inserted here
class Database {
Future<void> insertJSON() async {
db = await openDatabase(
join(await getDatabasesPath(), tableName),
onCreate: (db, version) {
return db.execute('''
INSERT INTO $tableName(column1, column2, etc) VALUES (${jsonData["Records].data1}, ${jsonData["Records].data2}, etc)
''');
}
);
}
}
Ответ №1:
ниже я показываю вам, как передавать данные между двумя экранами :
Экран 1 :
class HomeScreenTopContainer extends StatefulWidget {
@override
_HomeScreenTopContainerState createState() => _HomeScreenTopContainerState();
}
class _HomeScreenTopContainerState extends State<HomeScreenTopContainer> {
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Inkwell(onTap:(){
Navigator.push(
context,
MaterialPageRoute(builder: (context) => ParentLanding(parameter:"pass your value here")),
);
},child:Text("Tap Here and pass data")),
],
);
}
}
Экран 2 :
class ParentLanding extends StatefulWidget {
String parameter;
ParentLanding({Key key,String parameter}) : super(key: key,parameter:parameter);
@override
_ParentLandingState createState() => _ParentLandingState();
}
class _ParentLandingState extends State<ParentLanding> {
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Inkwell(onTap:(){
// you can use this parameter like this.
},child:Text(**Widget.parameter**)),
],
);
}
}
Ответ №2:
У вас есть много вариантов. Я предложу вам один. Измените подписи обоих методов.
Пример
Ваш класс HttpClient
Future<Map<String, dynamic>> makeRequest() async {
// ... your code
var jsonData = json.decode(putRequest.body);
return jsonData;
}
Ваш класс DB
Future<void> insertJSON(Map<String, dynamic> jsonData) async {
db = await openDatabase(
join(await getDatabasesPath(), tableName),
onCreate: (db, version) {
return db.execute('''
INSERT INTO $tableName(column1, column2, etc) VALUES
(${jsonData["Records].data1}, ${jsonData["Records].data2}, etc)
''');
}
);
}
Используйте третий класс / объект / метод, который вызывает api, принимает результат и передает его в класс db:
main() async {
HttClient http = HttpClient();
Database db = Database();
final json = await http.makeRequest();
await db.insertJSON(json);
}
Ответ №3:
Самый простой способ передать любое значение — использовать аргумент. Значение может быть отправлено как:
Keys.navKey.currentState.pushNamed(
Routes.gameViewScreen, arguments: jsonData );
В другом классе он может быть получен как :
var jsonData = ModalRoute.of(context).settings.arguments;