веб-интерфейс flutter: интерактивный просмотрщик

#flutter #web #stack

Вопрос:

На монтажной панели есть 10 коробок, и экран достаточно большой, чтобы вы могли видеть все 10 коробок. С другой стороны, если размер экрана невелик, все 10 коробок не отображаются на экране.

Я попытался передвинуть 10 штук так, чтобы я мог видеть ниже, некоторые коробки были отрезаны, поэтому они не выходили

Я хочу видеть все 10 полей, даже если экран маленький. Как мне решить эту проблему?

 class ArtBoard extends StatefulWidget {
  const ArtBoard({Key? key}) : super(key: key);

  @override
  _ArtBoardState createState() => _ArtBoardState();
}

class _ArtBoardState extends State<ArtBoard> {
  TransformationController _transformController = TransformationController();
  double _scale = 1;
  Offset startOffset = Offset.zero;

  @override
  void initState() {
    super.initState();          
  }

  @override
  void dispose() {
    _transformController.dispose();
    super.dispose();
  }

 
  void _handleViewerTransformed() =>
      _scale = _transformController.value.row0[0];

  @override
  Widget build(BuildContext context) {
    RandomColor _randomColor = RandomColor();
    return Scaffold(
      resizeToAvoidBottomInset: false,
      backgroundColor: Colors.transparent,
      body: Stack(
        fit: StackFit.expand,
        children: [
       
          Container(
            width: MediaQuery.of(context).size.width,
            height: MediaQuery.of(context).size.height,
            color: Colors.grey.shade500, 
            child: Center(
                child: Text('Design Board',
                    style: TextStyle(fontSize: 8, color: Colors.white70))),
          ),
          
          InteractiveViewer(
            transformationController: _transformController,
            boundaryMargin: EdgeInsets.all(double.infinity),
            constrained: true,
            minScale: 0.1,
            maxScale: 5.0,
            panEnabled: true,
            scaleEnabled: true,
            onInteractionUpdate: (ScaleUpdateDetails details) {
              //_transformationController.value.scale(1);
              //_transformationController.value.scale(details.scale);
              //print('Scale update:$details');
            },
            onInteractionEnd: (ScaleEndDetails details) {
              double correctScaleValue =
                  _transformController.value.getMaxScaleOnAxis();
              // unzoom when interaction has ended
              setState(() {
                print('${_transformController.value}');
                _transformController.toScene(Offset.zero);
              });
            },
            child: ListView.builder(
              physics: NeverScrollableScrollPhysics(),
              shrinkWrap: true,
              itemCount: 10,
              itemBuilder: (BuildContext context, int index) {
                return Align(
                  alignment: Alignment.center,
                  child: Container(
                      alignment: Alignment.center,
                      width: 100,
                      height: 80,
                      color: _randomColor.randomColor(),
                      child: Text('Box :${index}')),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}
 

Ответ №1:

Это проблема, из-за которой известен флаттер, потому что, как и в машинном коде, он не обрабатывает размер для вас, я рекомендую использовать пакет, такой как sizer от https://pub.dev

 SizedBox(
  width: 100.sp.clamp(10,100)
)
 

В этом примере «.sp» — это расширение числа (int и double) из пакета sizer, которое дает вам размер относительно размера экрана, а затем добавление «.clamp» позволяет вам иметь размер в пределах желаемого размера.

 10.sp.clamp(lowestPoint, maxPoint);
 

Комментарии:

1. Спасибо. Я использовал пакет Sizer, но это не решает проблему. Пожалуйста, дайте мне еще один совет о том, что делать.

2. вы пакет sizer, чтобы получить самую длинную сторону экрана, а затем просто используйте базовую математику, чтобы сделать коробки в соответствии с экраном экрана

Ответ №2:

ваш это, чтобы получить самую длинную сторону

 
final double longerSide = 100.w>100.h ? 100.w:100.h;
final double shorterSide = 100.w>100.h ? 100.h:100.w;

/// This builds a box using the lonerSide length and the shortSide length
Widget buildBox({required double lSide, required double sSide}) {
final averageHeight = longerSide / 10;
final averageWidth = shorterSide / 2;
  return Container(width: averageWidth, height: averageHeight, color: Colors.red);
}