Json 颤振/飞镖-如何在类之间传递变量?

Json 颤振/飞镖-如何在类之间传递变量?,json,flutter,variables,sqflite,Json,Flutter,Variables,Sqflite,我对编程非常陌生,我正在尝试将一个变量(jsonData)从一个未来传递到另一个不同类中的未来,因此变量中的数据可以存储在数据库中。不要困惑,我正在使用一个API来获取必要的数据,这工作得非常好。如何访问变量jsonData以插入数据 //first class gets the json data class getJSONData { Future<void> makeRequest() async { var url = "some url"; Map

我对编程非常陌生,我正在尝试将一个变量(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)
     ''');
     }
   );
 }
}
//第一个类获取json数据
类getJSONData{
Future makeRequest()异步{
var url=“some url”;
映射输入数据={
“密码”:例如,
“SQL”:SQL查询,
“数据库服务器”:“服务器”,
“db_表”:“表”,
};
var body=json.encode(inputData);
var putRequest=等待http.put(
encodeFull(url),标题:{“内容类型”:“应用程序/json”},
身体:身体),;
//必须存储此变量
var jsonData=json.decode(putRequest.body);
}
}
//需要在此处插入数据
类数据库{
Future insertJSON()异步{
db=等待开放数据库(
join(等待getDatabasesPath(),tableName),
onCreate:(数据库,版本){
返回db.execute(“”)
在$tableName(column1、column2等)中插入值(${jsonData[“Records].data1}、${jsonData[“Records].data2}等)
''');
}
);
}
}

下面我将向您展示如何在两个屏幕之间传递数据:

屏幕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")),
        
      ],
    );
  }
}
class HomeScreenTopContainer扩展StatefulWidget{
@凌驾
_HomeScreenTopContainerState createState()=>\u HomeScreenTopContainerState();
}
类_HomeScreenTopContainerState扩展状态{
@凌驾
void initState(){
//TODO:实现initState
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
墨水池(onTap:(){
导航器。推(
上下文
MaterialPage路由(生成器:(上下文)=>ParentLanding(参数:“在此处传递值”),
);
},子项:文本(“点击此处并传递数据”),
],
);
}
}
屏幕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**)),
            
          ],
        );
      }
    }
类ParentLanding扩展StatefulWidget{
字符串参数;
ParentLanding({Key-Key,String-parameter}):super(Key:Key,parameter:parameter);
@凌驾
_ParentLandingState createState()=>\u ParentLandingState();
}
类\u ParentLandingState扩展状态{
@凌驾
void initState(){
//TODO:实现initState
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
墨水池(onTap:(){
//您可以像这样使用此参数。
},子项:Text(**Widget.parameter**)),
],
);
}
}

传递任何值的最简单方法是使用参数。 值可以通过以下方式发送:

 Keys.navKey.currentState.pushNamed(
      Routes.gameViewScreen, arguments: jsonData );
在另一个类中,可以通过以下方式检索:

var jsonData = ModalRoute.of(context).settings.arguments;
你有很多选择。 我给你推荐一个。 更改这两种方法的签名。
例子

您的HttpClient类

Future<Map<String, dynamic>> makeRequest() async {
    // ... your code
    var jsonData = json.decode(putRequest.body);
    return jsonData;
}
    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)
          ''');
     }
   );
 }
main() async {
    HttClient http = HttpClient();
    Database db = Database();
    final json = await http.makeRequest();
    await db.insertJSON(json);
}