flutter 更新此控制器时是否需要setState()?

f0brbegy  于 2023-04-22  发布在  Flutter
关注(0)|答案(1)|浏览(134)

我是Dart/Flutter的新手,我见过examples,其中setState()是必需的。在下面的代码中,_bottomSheetController用于关闭底部工作表,目前没有在setState()内部更新。由于它是一个控制器,因此它不保存任何需要在UI中显示的值-控制器仅用于调用_bottomSheetController?.close(),显然(?)导致部件树被重建。代码按预期工作,但我不知道是否应该使用setState()

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: MapExample(),
        ),
      ),
    );
  }
}

class MapExample extends StatefulWidget {
  const MapExample({super.key});

  @override
  State<MapExample> createState() => _MapExampleState();
}

class _MapExampleState extends State<MapExample> {
  PersistentBottomSheetController<void>? _bottomSheetController;

  @override
  Widget build(BuildContext context) {
    return GoogleMap(
      onTap: (position) {
        if (_bottomSheetController != null) {
          _bottomSheetController?.close();
          _bottomSheetController = null;
        }
      },
      markers: {
        Marker(
          markerId: const MarkerId('0'),
          position: const LatLng(0, 0),
          onTap: () {
            _bottomSheetController = Scaffold.of(context).showBottomSheet<void>(
              (BuildContext context) {
                return const SizedBox(
                  height: 200,
                  child: Center(
                    child: Text('BottomSheet'),
                  ),
                );
              },
            );
          },
        )
      },
      initialCameraPosition: const CameraPosition(
        target: LatLng(0, 0),
        zoom: 11.0,
      ),
    );
  }
}
rwqw0loc

rwqw0loc1#

在这种情况下,您不需要调用setState。

相关问题