caduandrade / multi_split_view

Provides horizontal or vertical multiple split view for Flutter.
https://caduandrade.github.io/multi_split_view/
MIT License
129 stars 24 forks source link

How dynamic resize in code? #31

Closed Taron133 closed 1 year ago

Taron133 commented 1 year ago

I can resize in old versions:

controller: MultiSplitViewController(
    weights: [
      !visible1 && visible2 ?0.0000000000001 : visible1 && !visible2 ?1 :0.5,
      visible1 && !visible2 ?0.0000000000001 : !visible1 && visible2 ?1 :0.5
      ]
),

But can't in new version

controller: MultiSplitViewController(
  areas: [
    Area(weight: !visible1 && visible2 ?0.1 : visible1 && !visible2 ?1 :0.5),
    Area( weight: visible1 && !visible2 ?0.1 : !visible1 && visible2 ?1 :0.5)
  ],
),
caduandrade commented 1 year ago

Hi @Taron133 .

You should keep the controller in your State and set the areas parameter.

Examples (changing the second area)

_controller.areas = [Area(), Area(weight: .1)];
_controller.areas = [Area(), Area(size: 150)];
labulakalia commented 1 year ago

@caduandrade i use this method change size will Exception

  Widget build(BuildContext context) {
    return MultiSplitView(
      controller: _controller,
      children: [
        LayoutBuilder(builder: (k, b) {
          if (b.minWidth > 300) {
            _controller.areas = [Area(weight: 0.2), Area()];
          }
          return Column(
            children: [
              Padding(
                padding: const EdgeInsets.only(top: 10, bottom: 10, left: 10),
                child: Row(
                  children: [
                    IconButton(
                        onPressed: () {},
                        icon: Icon(FluentIcons.add_20_regular)),
                    IconButton(
                        onPressed: () {},
                        icon: Icon(FluentIcons.add_20_regular)),
                    IconButton(
                        onPressed: () {},
                        icon: Icon(FluentIcons.add_20_regular)),
                    IconButton(
                        onPressed: () {},
                        icon: Icon(FluentIcons.add_20_regular)),
                  ],
                ),
              ),
              Expanded(child: TabBody())
            ],
          );
        }),
        Container(
          color: Colors.grey,
        )
      ],
    );
  }
======== Exception caught by gesture ===============================================================
The following _CastError was thrown while handling a gesture:
Null check operator used on a null value

When the exception was thrown, this was the stack: 
#0      _MultiSplitViewState._onDragEnd (package:multi_split_view/src/multi_split_view.dart:603:32)
#1      _MultiSplitViewState._populateHorizontalChildren.<anonymous closure> (package:multi_split_view/src/multi_split_view.dart:497:48)
#2      DragGestureRecognizer._checkEnd.<anonymous closure> (package:flutter/src/gestures/monodrag.dart:521:47)
#3      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:253:24)
#4      DragGestureRecognizer._checkEnd (package:flutter/src/gestures/monodrag.dart:521:5)
#5      DragGestureRecognizer.didStopTrackingLastPointer (package:flutter/src/gestures/monodrag.dart:426:9)
#6      OneSequenceGestureRecognizer.stopTrackingPointer (package:flutter/src/gestures/recognizer.dart:446:9)
#7      DragGestureRecognizer._giveUpPointer (package:flutter/src/gestures/monodrag.dart:435:5)
#8      DragGestureRecognizer.handleEvent (package:flutter/src/gestures/monodrag.dart:354:7)
#9      PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:98:12)
#10     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:143:9)
#11     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:617:13)
#12     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:141:18)
#13     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:127:7)
#14     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:460:19)
#15     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:440:22)
#16     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:337:11)
#17     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:395:7)
#18     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:357:5)
#19     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:314:7)
#20     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:295:7)
#21     _invoke1 (dart:ui/hooks.dart:167:13)
#22     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:341:7)
#23     _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31)
Handler: "onEnd"
Recognizer: HorizontalDragGestureRecognizer#67121
  debugOwner: GestureDetector
  start behavior: start

flutter version

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.3.0, on macOS 12.4 21F79 darwin-x64, locale zh-Hans-CN)
[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location.

[✓] Xcode - develop for iOS and macOS (Xcode 13.3)
[✗] Chrome - develop for the web (Cannot find Chrome executable at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome)
    ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.
[!] Android Studio (not installed)
[✓] IntelliJ IDEA Ultimate Edition (version 2021.1.3)
[✓] VS Code (version 1.70.2)
[!] Proxy Configuration
    ! NO_PROXY is not set
[✓] Connected device (1 available)
[✓] HTTP Host Availability
caduandrade commented 1 year ago

Hi @labulakalia!

Can you use the 2.3.0 version and wrap the setter with a Future? Can't rebuild and set state at the same time.

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

void main() => runApp(MultiSplitViewExampleApp());

class MultiSplitViewExampleApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Example(),
    );
  }
}

class Example extends StatefulWidget {
  @override
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  MultiSplitViewController _controller = MultiSplitViewController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: MultiSplitView(
      controller: _controller,
      children: [
        LayoutBuilder(builder: (context, constraints) {
          if (constraints.minWidth > 600) {
            Future.microtask(
                () => _controller.areas = [Area(weight: 0.2), Area()]);
          }
          return Container(
              color: Colors.blue,
              child: Center(
                  child:
                      Text('constraints.minWidth: ${constraints.minWidth}')));
        }),
        Container(color: Colors.green)
      ],
    ));
  }
}