首页 > 解决方案 > 如何从整个班级颤振中访问字符串

问题描述

正如您在我的代号值中看到的那样,我有一个字符串。我将数据保存为 SharedPreferences 并检索它。但是我现在的问题是如何从每个地方使用它?如何在 read() async 中访问它?我需要从抽屉小部件访问它,但现在我做不到。

如果有人知道解决方案,请帮助我

_read() async {
  final prefs = await SharedPreferences.getInstance();
  final key = 'my_int_key';
  final value = prefs.getString(key) ?? 0;
  print('read: $value');
}


class MyApp extends StatelessWidget {
 final String email;

 var value="";

 MyApp({Key key, @required this.email}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
            title: Text(value)
        ),
        drawer: Drawer(
          child: ListView(
            // Important: Remove any padding from the ListView.
            padding: EdgeInsets.zero,
            children: <Widget>[
              DrawerHeader(
                child: Text(value),
                decoration: BoxDecoration(
                  color: Colors.blue,
                ),
              ),
              ListTile(
                title: Text('Item 1 '),
                onTap: () {

                  //logindata.setBool('login', true);
                  Navigator.push(context, MaterialPageRoute(builder: (context) => LoginUser()),);
                },
              ),
              ListTile(
                title: Text('Item 2'),
                onTap: () {


                //  Navigator.pop(context);
                },
              ),
            ],
          ),
        ),

        body: JsonImageList(),
        floatingActionButton: FloatingActionButton(
          onPressed: () {

            //Navigator.push(context, MaterialPageRoute(builder: (context) => NewTopics()
            Navigator.push(context, MaterialPageRoute(builder: (context) => UploadImageDemo()
            ),);
          },

          child: Icon(Icons.add),
        ),

      ));
  }
}

class Flowerdata {
  int id;
  String flowerName;
  String flowerImageURL;

  Flowerdata({
    this.id,
    this.flowerName,
    this.flowerImageURL
  });

  factory Flowerdata.fromJson(Map<String, dynamic> json) {
    return Flowerdata(
        id: json['id'],
        flowerName: json['nametopics'],
        flowerImageURL: json['image']

    );
  }
}

class JsonImageList extends StatefulWidget {

  JsonImageListWidget createState() => JsonImageListWidget();

}

class JsonImageListWidget extends State {
SharedPreferences logindata;
  String username;



  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    initial();

  }

  void initial() async {
    var logindata = await SharedPreferences.getInstance();
   // logindata = await SharedPreferences.getInstance();
    setState(() {
      read();

      username = logindata.getString('username');
      return username;

    });
  }
final String apiURL = 'http://192.168.42.33/getFlowersList.php';
  //final String apiURL = 'http://192.168.8.106/getFlowersList.php';

  Future<List<Flowerdata>> fetchFlowers() async {

    var response = await http.get(apiURL);

    if (response.statusCode == 200) {

      final items = json.decode(response.body).cast<Map<String, dynamic>>();

      List<Flowerdata> listOfFruits = items.map<Flowerdata>((json) {
        return Flowerdata.fromJson(json);
      }).toList();

      return listOfFruits;
    }
    else {
      throw Exception('Failed to load data from Server.');
    }
  }

  getItemAndNavigate(String item, BuildContext context){
    Navigator.push(
        context,
        MaterialPageRoute(
            builder: (context) => SecondScreen(itemHolder : item)
        )
    );
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<Flowerdata>>(
      future: fetchFlowers(),
      builder: (context, snapshot) {

        if (!snapshot.hasData) return Center(
            child: CircularProgressIndicator()
        );

        return ListView(

          children: snapshot.data
              .map((data) => Column(children: <Widget>[

            GestureDetector(
              onTap: ()=>{
                getItemAndNavigate(data.flowerName, context)
              },
              child: Row(

                  children: [
                    Container(

                        width: 200,
                        height: 100,
                        margin: EdgeInsets.fromLTRB(10, 0, 10, 0),
                        child: ClipRRect(
                            borderRadius: BorderRadius.circular(8.0),
                            child:
                            Image.network(data.flowerImageURL,
                              width: 200, height: 100, fit: BoxFit.cover,))),

                    Flexible(child:
                    Text(data.flowerName,
                        style: TextStyle(fontSize: 18)))

                  ]),),

            Divider(color: Colors.black),

          ],))
              .toList(),

        );

      },

    );

  }

}


getItemAndNavigate(String item, BuildContext context){
  Navigator.push(
      context,
      MaterialPageRoute(
          builder: (context) => SecondScreen(itemHolder : item)

      )
  );
}


read() async {

  final prefs = await SharedPreferences.getInstance();
  final key = 'my_int_key';
  final value = prefs.getString(key) ?? 0;
  print('read: $value');
}


标签: flutter

解决方案


做这个,

var value="";

然后,在 read() 方法中,在 setState() 中对其进行初始化,以便当它从未来获取值时,它可以反映在 UI 中。

setState((){
value = prefs.getString(key) ?? 0;
});

现在,在抽屉里,你可以使用变量的值,

DrawerHeader(
                child: Text(value),
                decoration: BoxDecoration(
                  color: Colors.blue,
                ),
              ),
              

更新:-

1)将您的 StateLess Widget 更改为 StateFul Widget。

2)确保在初始化值时设置状态,

setState((){
value = prefs.getString(key) ?? 0;
});


推荐阅读