web-dev-qa-db-ja.com

Flutter:Googleマップでウィジェットを変更しないようにする方法は?

Google Maps for Flutter ウィジェットを使用しています。私のアプリでは、BottomNavigationBarのいずれかのタブを介してマップが表示されます。

そして、私は次の問題を抱えています:

  1. ユーザーはマップのタブにあります
  2. ユーザーがタブを変更する(別のタブをタップする)
  3. [問題]ユーザーがマップのタブで戻ると、マップが再描画される。

ユーザーがマップのタブを離れたときと同じようにマップを保持したいので、後でマップに戻ったときにも引き続き作業できます。

しようとしました:

  • pageStorageを使用します-成功しません。
  • mapの状態のシングルトーンのようなものを作成します-成功しません。
  • automaticKeepAliveClientMixin( ここで見た )を使用してください。これは有望に見えましたが、まだ成功していません。

(私は何か間違ったことをしたかもしれないことを認めます)

最後の試行のコード:

class MapScreen extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => MapScreenState();
}

class MapScreenState extends State<MapScreen> with AutomaticKeepAliveClientMixin {
  GoogleMapController mapController;

  @override
  bool get wantKeepAlive => true;

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Scaffold(
        appBar: AppBar(
          title: const Text("Map"),
        ),
        body: GoogleMap(
          onMapCreated: _onMapCreated,
        )
    );
  }

  void _onMapCreated(GoogleMapController controller) {
      mapController = controller;
      updateKeepAlive();
  }
}

そのため、MapScreenを変更せずにそのまま維持する方法、またはユーザーがMapScreenに戻ったときに何らかの方法でその状態を保存して復元する方法が必要です。または、問題を解決する他の何か。

15
AQRC

IndexedStack を使用します

例えば:

Class _ExamplePageState extends State<ExamplePage> {
  int _bottomNavIndex = 0;

  final List<Widget> _children = [
    WidgetOne(),
    WidgetTwo(),
    GoogleMap(),
  ]

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: IndexedStack(
        index: _bottomNavIndex,
        children: _children,
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _bottomNavIndex,
        onTap: (index) {
          if (_bottomNavIndex == index) return;
          setState(() {
            _bottomNavIndex = index;
          });
        }
        items: [ ... ]
      ),
    );
  }
}
0
AaronJ