'Trying to use Hivedb with a multi state nav bar app

I'm trying to use the hive db to store simple objects in an app that has 3 main pages, selected with a nav bar in the following form (following closely the example from the flutter docs).

  /// determine body widget ie page to be rendered
  int _pageIndex = 0;

  /// list of body widgets
  static const List<Widget> _pageOption = [
    KeyList(), //index 0
    PersonalKey(), //index 1
    Crypt(), //index 2
  ];

  /// [index] tells body of scaffold what widget to render
  void _changePage(int index) {
    setState(() {
      _pageIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          widget.title,
          style: const TextStyle(color: cyan),
        ),
      ),
      body: Center(
        child: _pageOption.elementAt(_pageIndex),
      ),

I'm not sure how to get the hive box to open / work with each page. for instance a Box would need to used in the KeyList() page. I tried passing the box through state but this is warned against and didn't work.

I tried varies combinations of an async main function and an overriden innitState function in _KeyListState() and now I'm not getting any widgets to render.

main function (from main.dart)

void main() async {
  await Hive.initFlutter();
  await Hive.openBox<ContactKey>('contacts');
  Hive.registerAdapter(ContactKeyAdapter());
  runApp(const MyApp());
}

reference from key_list.dart

class _KeyListState extends State<KeyList> {

  late final Box contactBox;

  @override
  void initState() {
    super.initState();
    contactBox = Hive.box("contacts");
    // makeKeyList();
  }

  @override
  void dispose() {
    Hive.close();
    super.dispose();
  }
  final List<ContactKey> _keys = []; // = [
  //   ContactKey(contactName: "cade", publicKey: "123")
  // ];

  void addKey(String name, String key) async {
    ContactKey newContact = ContactKey(contactName: name, publicKey: key);
    setState(() {
      contactBox.add(newContact);
      makeKeyList();
    });
  }

  void makeKeyList() {
    if (contactBox.isNotEmpty) {
      for (var i = 0; i < contactBox.length; i++) {
        _keys.add(contactBox.getAt(i));
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
    ...

I'm not getting any errors or warnings but when the app is running I get the error "each child must be laid out only once" A google search on this error made it seem like a flutter bug, but if I remove the Hive code my app renders again.

I'm pretty lost right now and if anyone has any tips or sample apps that use a nav bar with hive they'd be greatly appreciated!

Thanks



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source